本記事でできること
想定シーン
ロボットをビジュアルフィードバック制御する
カメラを使ったロボットアームの制御方法を、ビジュアルフィードバック制御といいます。ここでは、ビジュアルフィードバック制御を使った自動化システムを開発する際に必要となる画像認識プログラムをまとめています。
画像が真っ黒かどうか判定する
OpenCVの関数のいくつかには、画像が真っ黒な場合にはプログラムが意図通り動作しないものがあります。たとえば、画像内の物体をラベリングする関数や、物体の数を数える関数などです。本記事では、画像が真っ黒(白い領域がひとつもない)かどうかを判定するプログラムを掲載します。ロボットのビジュアルフィードバック制御アプリケーションを作成する際のヘルパー関数として使用すると便利だと思います。
実行環境
- OS:Ubuntu 22.04 LTS
- 言語:C++
- クルーボ:v5.1.0
クルーボについて
ロボットアプリケーション開発には、株式会社チトセロボティクスのロボット制御ソフトウェア「クルーボ」を使用します。本記事のプログラムは、クルーボがインストールされた制御コンピュータ上で動作します。
- クルーボの製品サイト:https://chitose-robotics.com/
プログラム抜粋
bool is_black_image(const cv::Mat& image) {
cv::Mat image_gray = convert_grayscale(image);
int count_non_zero_pizels = cv::countNonZero(image_gray);
if (count_non_zero_pizels == 0) {
return true;
} else {
return false;
}
}
全体プログラム
#include <iostream>
#include <opencv2/opencv.hpp>
cv::Mat convert_grayscale(const cv::Mat& image) {
const int grayscale_channel_num = 1;
if (image.channels() == grayscale_channel_num) {
return image.clone();
}
cv::Mat gray_image;
cvtColor(image, gray_image, cv::COLOR_BGR2GRAY);
return gray_image;
}
bool is_black_image(const cv::Mat& image) {
cv::Mat image_gray = convert_grayscale(image);
int count_non_zero_pizels = cv::countNonZero(image_gray);
if (count_non_zero_pizels == 0) {
return true;
} else {
return false;
}
}
cv::Mat invert_image(const cv::Mat& image) {
cv::Mat gray_image = convert_grayscale(image);
cv::Mat inverted_image;
cv::bitwise_not(gray_image, inverted_image);
return inverted_image;
}
int main(void) {
const cv::Size image_size(1280, 960);
const cv::Mat black_image = cv::Mat::zeros(image_size.height, image_size.width, CV_8UC3);
const cv::Mat white_image = invert_image(black_image);
std::cout << "black_image is black image? : " << std::boolalpha << is_black_image(black_image) << std::endl;
std::cout << "white_image is black image? : " << std::boolalpha << is_black_image(white_image) << std::endl;
return 0;
}
実行結果
black_image is black image? : true
white_image is black image? : false
おわりに
人手作業をロボットアームで自動化するために、カメラを使ったロボット制御=ビジュアルフィードバック制御が大切です。
ロボット制御用の画像認識でも中身のひとつひとつはシンプルなので、要素に分解して解説していきたいと思います。