OpenCVで白色検出する。

 いよいよ、OpenCVで色検出してみます。
Google先生にお伺いを立てると該当しているサイトを見つけました。


今回は、こちらのサイトにあったソースコードを使いました。

-----------------------------------------
OS:Windows XP
開発環境: Visual C++ 2010 Express
ライブラリ: OpenCV 2.2
-----------------------------------------

○赤色検出(1)

アルゴリズムは以下の通り。
----------
赤いピクセル(赤150以上、緑・青100以下の部分)を論理積で抽出する。
--------

ソースコードを丸ごとコピペし、プログラムをビルドしました。早速実行してみると、

現画像です。レゴとオセロ板を写しました。
送信者 201103

うーん、調整が必要ですね。
送信者 201103

デバッグコンソールはこんな感じです。
送信者 201103

○赤色検出(2)

2番目のアルゴリズムは以下の通り。
---------
「赤の要素が青・緑それぞれの1.5倍あり、さらに赤が100以上の値のピクセル」を赤とみなして抜き出す
--------------

送信者 201103

実行直後は、以下のようにいい感じに表示されるのですが、
送信者 201103

5−10秒くらいたつとやはり、赤色検出がうまくいきません。微調整が必要なのかな?
送信者 201103

○白色検出する。
サンプルプログラムを動作中にコンソール画面に表示されるパラメータを観測してみた。
すると、白のオセロ駒をカーソルに当てるとR=G=B=254になっている。黒の駒は、光りの加減で値が前後してしまう。
それなので、サンプルプログラム(1)のアルゴリズムを使って、白色駒を検出するプログラムを作成した。
R,G,Bとも220以上を論理積で抽出するようにした。

変更の内容は、以下の通り。

#if 0
      cvThreshold(imgR, imgThreshold_R, 150, 255, CV_THRESH_BINARY); // 赤が150以上
      cvThreshold(imgG, imgThreshold_G, 100, 255, CV_THRESH_BINARY_INV); // 緑が100以下
      cvThreshold(imgB, imgThreshold_B, 100, 255, CV_THRESH_BINARY_INV);
#else
      cvThreshold(imgR, imgThreshold_R, 220, 255, CV_THRESH_BINARY);
      cvThreshold(imgG, imgThreshold_G, 220, 255, CV_THRESH_BINARY);
      cvThreshold(imgB, imgThreshold_B, 220, 255, CV_THRESH_BINARY);
#endif

以下、実行画面です。
現画像です。
送信者 201103

おっ!いい感じに識別してくれてます。
送信者 201103

コンソール画面です。
送信者 201103

白色の識別ができるようになったので当初の目標の最低ラインを達成できました。
コメント
トラックバック
この記事のトラックバックURL