この記事は私が主催しているRobotVision勉強会の内容メモです。OpenCVの内容については下のサイトやOpenCV3.2.0のドキュメントを参考にしています。なお、開発環境はUbuntu16.04、OpenCV3.2.0です。第2回に実施した色による物体抽出のサンプルコードを紹介します。
1.サンプルコード
#include <opencv2/line_descriptor.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/features2d.hpp> #include <opencv2/highgui.hpp> #include "opencv2/imgproc/imgproc.hpp" #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> int blue_min = 0, blue_max = 255; int green_min = 0, green_max = 255; int red_min = 0, red_max = 255; char window_name[] = "Sample Program 2"; char window_name2[] = "Original Image"; char threshold_red_min[] = "Red Min"; char threshold_red_max[] = "Red Max"; char threshold_green_min[] = "Green Min"; char threshold_green_max[] = "Green Max"; char threshold_blue_min[] = "Blue Min"; char threshold_blue_max[] = "Blue Max"; cv::Mat dst, src; // コールバック関数 void inRangeDemo(int, void*) { // BGR cv::inRange(src, cv::Scalar(blue_min, green_min, red_min), cv::Scalar(blue_max, green_max, red_max), dst); cv::imshow(window_name, dst); } int main( int argc, char** argv ) { // 画像のロード src = cv::imread("winkit2.jpg", cv::IMREAD_COLOR); if(src.empty()) { std::cerr << "Failed to open image file." << std::endl; return -1; } // ウインドウの生成 cv::namedWindow(window_name, CV_WINDOW_AUTOSIZE); cv::namedWindow(window_name2, CV_WINDOW_AUTOSIZE); // 線の描画 cv::line(src, cv::Point(0, 0), cv::Point(640, 480), cv::Scalar(255, 0, 0), 2, 8); // 四角形の描画 cv::rectangle(src, cv::Point(400,400), cv::Point(490,450), cv::Scalar(255,255, 0), 1, 4); cv:: putText(src, "Robot Vision Workshop", cv::Point(200, 100), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0,255,255), 4); // 円の描画 cv::circle(src, cv::Point(400, 200), 30.0, cv::Scalar(0, 0, 255), -1, 8 ); cv::circle(src, cv::Point(470, 200), 30.0, cv::Scalar(255, 0, 0), -1, 8 ); cv::circle(src, cv::Point(540, 200), 30.0, cv::Scalar(0, 255, 0), -1, 8 ); // トラックバーの生成 cv::createTrackbar(threshold_red_min,window_name, &red_min, 255, inRangeDemo); cv::createTrackbar(threshold_red_max,window_name, &red_max, 255, inRangeDemo); cv::createTrackbar(threshold_green_min,window_name, &green_min, 255, inRangeDemo); cv::createTrackbar(threshold_green_max,window_name, &green_max, 255, inRangeDemo); cv::createTrackbar(threshold_blue_min,window_name, &blue_min, 255, inRangeDemo); cv::createTrackbar(threshold_blue_max,window_name, &blue_max, 255, inRangeDemo); // ゴールバック関数の初期化 inRangeDemo(0, 0); // 画像表示 cv::imshow(window_name2, src); // キー入力待 cv::waitKey(0); return(0); }
2. ハンズオン
- 以下のソースコードをダウンロード、makeして実行しよう。
- ソースコードのAPIの意味を調べてプログラムを理解しよう。
- トラックバーを動かして赤の円だけを表示させよう。同様に青、緑の円だけをそれぞれ表示させよう。そのときの各しきい値の値を記録しよう。
- サッカーボールだけを表示させるようにトラックバーを動かそう。そのときの各しきい値の値を記録しよう。
- 赤、青、緑の各しきい値は適用に動かして決めましたが、これをもう少しスマートにやる方法を考えよう!
- サンプルプログラムのAPIを調べて各引数の意味をわかろう。
以上
コメント