簡単な色検出

良い一日。

この短い投稿では、 OpenCVを使用して色でオブジェクトを検索する簡単な方法を示したかったのです。



実験には、Logitech WebCam C270カメラを使用しました





それでは始めましょう



必要なものすべてを接続します

#include <opencv2/opencv.hpp> #include <iostream> #include <cstdlib> //   exit() using namespace cv; using std::cout; using std::endl;
      
      







変数を宣言する

 char mainWindow[] = "Main"; char trackbarWindow[] = "Trackbar"; char thresholdWindow[] = "Threshold"; int min = 0, max = 1000; int hmin = 0, smin = 0, vmin = 0, hmax = 255, smax = 255, vmax = 255; Mat frame, HSV, threshold, blurred; VideoCapture capture;
      
      







カラーバートラックバーを作成する

 createTrackbar("H min:", trackbarWindow, &hmin, hmax); createTrackbar("H max:", trackbarWindow, &hmax, hmax); createTrackbar("S min:", trackbarWindow, &smin, smax); createTrackbar("S max:", trackbarWindow, &smax, smax); createTrackbar("V min:", trackbarWindow, &vmin, vmax); createTrackbar("V max:", trackbarWindow, &vmax, vmax); createTrackbar("Size min:", trackbarWindow, &min, max); createTrackbar("Size max:", trackbarWindow, &max, max);
      
      







カメラを開く

 capture.open(1); if(!capture.isOpened()){ cout << "    ." << endl; exit(1); }
      
      







カメラ処理サイクルを開始します

 for(;;){ capture >> frame; cvtColor(frame, HSV, COLOR_BGR2HSV); medianBlur(HSV, blurred, 21); inRange(blurred, Scalar(hmin, smin, vmin), Scalar(hmax, smax, vmax), threshold); for(int y = 0; y < threshold.rows; y++){ for(int x = 0; x < threshold.cols; x++){ int value = threshold.at<uchar>(y, x); if(value == 255){ Rect rect; int count = floodFill(threshold, Point(x, y), Scalar(200), &rect); if(rect.width >= min && rect.width <= max && rect.height >= min && rect.height <= max){ rectangle(frame, rect, Scalar(255, 0, 255, 4)); } } } } imshow(mainWindow, frame); imshow(thresholdWindow, threshold); if(waitKey(33) == 27) break; }
      
      







このループでは、まずフレームをRGBからHSVに変換します。 次に、ぼかしを実行し、色検索関数を呼び出します。 inRange()関数は、「from and to」の原則に基づいて検索を行います。 どの色からどのピクセルを選択するか。 次に、フレームの各ピクセルを処理します。ピクセルが白の場合は、グレーで塗りつぶします。 さて、四角形()関数を使用して、選択した領域の周囲に四角形を描画するだけでオブジェクトを選択します。



レモン検索の例を次に示します。





完全なソースコード
 #include <opencv2/opencv.hpp> #include <iostream> #include <cstdlib> using namespace cv; using std::cout; using std::endl; int main(int argc, char **argv){ char mainWindow[] = "Main"; char trackbarWindow[] = "Trackbar"; char thresholdWindow[] = "Threshold"; int min = 0, max = 1000; int hmin = 0, smin = 0, vmin = 0, hmax = 255, smax = 255, vmax = 255; Mat frame, HSV, threshold, blurred; VideoCapture capture; //  namedWindow(mainWindow, 0); namedWindow(trackbarWindow, 0); namedWindow(thresholdWindow, 0); //  createTrackbar("H min:", trackbarWindow, &hmin, hmax); createTrackbar("H max:", trackbarWindow, &hmax, hmax); createTrackbar("S min:", trackbarWindow, &smin, smax); createTrackbar("S max:", trackbarWindow, &smax, smax); createTrackbar("V min:", trackbarWindow, &vmin, vmax); createTrackbar("V max:", trackbarWindow, &vmax, vmax); createTrackbar("Size min:", trackbarWindow, &min, max); createTrackbar("Size max:", trackbarWindow, &max, max); //  capture.open(1); if(!capture.isOpened()){ cout << "    ." << endl; exit(1); } //     for(;;){ capture >> frame; cvtColor(frame, HSV, COLOR_BGR2HSV); medianBlur(HSV, blurred, 21); inRange(blurred, Scalar(hmin, smin, vmin), Scalar(hmax, smax, vmax), threshold); for(int y = 0; y < threshold.rows; y++){ for(int x = 0; x < threshold.cols; x++){ int value = threshold.at<uchar>(y, x); if(value == 255){ Rect rect; int count = floodFill(threshold, Point(x, y), Scalar(200), &rect); if(rect.width >= min && rect.width <= max && rect.height >= min && rect.height <= max){ rectangle(frame, rect, Scalar(255, 0, 255, 4)); } } } } imshow(mainWindow, frame); imshow(thresholdWindow, threshold); if(waitKey(33) == 27) break; } return 0; }
      
      








All Articles