この記事は私が主催している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を調べて各引数の意味をわかろう。
以上


コメント