OpenCVで特定の色の位置を取得

OpenCVで特定の色の位置を取得するサンプルです。精度がよくなく、おおざっぱな方法のため、使える場面は限定されるかもしれません。

青・緑・赤のボールだけ認識

吊るされたコットンボールの中で、青、緑、赤のみを認識させます。

認識した場合、緑の円が描画されます。

精度はあまり高くなく、作ったサンプルコードでは、1色につき1つまでしかボールを認識できない制限もあります。

環境・バージョン

Windows10
Python 3.6.4
OpenCV3.4.0

2018年末にOpenCV4が出ているようです。OpenCV3でしか動作確認していないので、ご注意ください。

ボールの色認識のコード

昔書いたボールの輪郭抽出のコードを少し作り変えています。

認識する色の範囲や、最小半径は、扱う映像に合わせて調整してください。

コードの53~55行目で、各色のマスクを作っています。

getMask([最小の色相,彩度,明度], [最大の色相,彩度,明度])で抽出したい色の範囲を指定します。(ただし赤のみ諸事情で最小明度と最大明度・彩度の値が無視されます。)

上記コードでは、例えば青のマスクの場合、色相110~150の間、彩度45~255、明度30~255を取得しています。

そして58~60行目で、各色でマスクされた画像を元に、輪郭(位置)を取得します。

getContoursの最後の引数(75)が、認識する最小半径の指定です。より小さいものを認識するときは、値を小さくします。

ただし、小さいほどノイズに反応して、誤認されるかもしれません。

“OpenCVで特定の色の位置を取得” への3件の返信

  1. ありがとうございます参考になります
    赤色の丸だけを複数認識するとなるとどうなりますでしょうか?
    気になったので質問します

    1. 38行目のcnt = contours[0]で、一番大きい面積(ボール)を1つ抽出しています。
      2つ認識させる場合は、contours[1]、3つならcontours[2]・・・と、forで繰り返すと複数認識になるかと思います。
      週末あたり余力あれば、コードを書いて掲載します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)