RobotVision勉強会:第2回 色による物体抽出

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

以上

コメント

タイトルとURLをコピーしました