本記事でできること
想定シーン
ロボットをビジュアルフィードバック制御する
カメラを使ったロボットアームの制御方法を、ビジュアルフィードバック制御といいます。ここでは、ビジュアルフィードバック制御を使った自動化システムを開発する際に必要となる画像認識プログラムをまとめています。
画像を縮小する
工業用カメラの画素数は640×480ピクセルの小さなものから、1920×1080ピクセルの大きなものまで、さまざまな機種がラインナップされています。ただ、画像検査等ではなく、ロボットのビジュアルフィードバック制御でカメラ画像を使用する場合にはあまり高い解像度でないほうが、処理時間を短縮できて便利です。ここでは、取得した画像を縮小するプログラムを掲載します。
実行環境
- OS:Ubuntu 22.04 LTS
- 言語:C++
- クルーボ:v5.1.0
クルーボについて
ロボットアプリケーション開発には、株式会社チトセロボティクスのロボット制御ソフトウェア「クルーボ」を使用します。本記事のプログラムは、クルーボがインストールされた制御コンピュータ上で動作します。
- クルーボの製品サイト:https://chitose-robotics.com/product
プログラム抜粋
cv::Mat shrink_image(const cv::Mat& image, const cv::Size resized_size) {
cv::Mat resized_image;
float resized_width = (float)resized_size.width;
float resized_height = (float)resized_size.height;
float image_rows = (float)image.rows;
float image_cols = (float)image.cols;
float resized_ratio = std::fmin(resized_width / image_cols, resized_height / image_rows);
if (resized_ratio < 1.0) {
cv::resize(image, resized_image, cv::Size(), resized_ratio, resized_ratio, cv::INTER_NEAREST);
} else {
resized_image = image.clone();
}
return resized_image;
}
全体プログラム
#include <iostream>
#include <opencv2/opencv.hpp>
cv::Mat load_image(const std::string file_path) {
cv::Mat loaded_image = cv::imread(file_path, 1);
if (loaded_image.empty()) {
throw std::runtime_error("画像を正常に読み込めませんでした。");
}
return loaded_image;
}
cv::Mat shrink_image(const cv::Mat& image, const cv::Size resized_size) {
cv::Mat resized_image;
float resized_width = (float)resized_size.width;
float resized_height = (float)resized_size.height;
float image_rows = (float)image.rows;
float image_cols = (float)image.cols;
float resized_ratio = std::fmin(resized_width / image_cols, resized_height / image_rows);
if (resized_ratio < 1.0) {
cv::resize(image, resized_image, cv::Size(), resized_ratio, resized_ratio, cv::INTER_NEAREST);
} else {
resized_image = image.clone();
}
return resized_image;
}
int main(void) {
std::string file_path = "../data/fuji.jpg";
const cv::Mat loaded_image = load_image(file_path);
const cv::Size resized_size(320, 240);
const cv::Mat shrinked_image = shrink_image(loaded_image, resized_size);
cv::imshow("loaded_image", loaded_image);
cv::imshow("shrinked_image", shrinked_image);
cv::waitKey(0);
}
おわりに
人手作業をロボットアームで自動化するために、カメラを使ったロボット制御=ビジュアルフィードバック制御が大切です。
ロボット制御用の画像認識でも中身のひとつひとつはシンプルなので、要素に分解して解説していきたいと思います。