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で特定の色の位置を取得” への5件の返信

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

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

    1. 下記でできると思います。[200, 200, 200]の数字が大きいほど検出する白の範囲が狭まります。

      import cv2
      import numpy as np

      image = cv2.imread('./test1.png') # ファイル読み込み

      # BGRでの色抽出
      bgrLower = np.array([200, 200, 200]) # 抽出する色の下限(BGR)
      bgrUpper = np.array([255, 255, 255]) # 抽出する色の上限(BGR)
      img_mask = cv2.inRange(image, bgrLower, bgrUpper) # BGRからマスクを作成
      result = cv2.bitwise_and(image, image, mask=img_mask) # 元画像とマスクを合成

      参考:
      【python/OpenCV】画像の特定の色を抽出する方法

コメントを残す

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

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