カラーブロックの検出
ビデオチュートリアル4 - 色認識: https://singtown.com/learn/49993/
find_blobs関数
ボールのトラッキングは、OpenMVで最もよく使われる機能です。10分で始めるクイックスタートでは、\ find_blobs関数を使ってカラーブロックを検出しました。ここではfind_blobsの詳細について説明します。
image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge=False, margin=0, threshold_cb=None, merge_cb=None)
ここには多くのパラメータがあります。
- thresholdsはカラーしきい値です。注意: このパラメータはリストであり、複数の色を含めることができます。1色だけが必要な場合は、リストの中に色の値を1つだけ入れます。複数のカラーしきい値が必要な場合は、リストに複数のしきい値を入れます。注意: 戻り値のカラーブロックオブジェクトblobに対してcodeメソッドを呼び出すことで、そのカラーブロックが何色であるかを判定できます。
red = (xxx,xxx,xxx,xxx,xxx,xxx)
blue = (xxx,xxx,xxx,xxx,xxx,xxx)
yellow = (xxx,xxx,xxx,xxx,xxx,xxx)
img=csi0.snapshot()
red_blobs = img.find_blobs([red])
color_blobs = img.find_blobs([red,blue, yellow])
roiは「関心領域(region of interest)」です。統計情報の使用方法のところですでに説明しました。
left_roi = [0,0,160,240]\ blobs = img.find_blobs([red],roi=left_roi)
x_strideは検索するカラーブロックのx方向の最小ピクセル幅です。デフォルト値は2です。幅が10ピクセルを超えるカラーブロックのみを検出したい場合は、このパラメータを10に設定します。
blobs = img.find_blobs([red],x_stride=10)
y_strideは検索するカラーブロックのy方向の最小ピクセル幅です。デフォルト値は1です。幅が5ピクセルを超えるカラーブロックのみを検出したい場合は、このパラメータを5に設定します。
blobs = img.find_blobs([red],y_stride=5)
invertはしきい値を反転し、しきい値の範囲外の色を検索対象のしきい値として使用します。
area_thresholdは面積のしきい値です。検出されたカラーブロックの外接矩形の面積がこの値より小さい場合、フィルタリングされて除外されます。
pixels_thresholdはピクセル数のしきい値です。カラーブロック内のピクセル数がこの値より小さい場合、フィルタリングされて除外されます。
mergeはマージ設定です。Trueに設定すると、重なり合うすべてのブロブが1つにマージされます。\ 注意: これは色に関係なくすべてのブロブをマージします。複数の色のブロブをまとめずに扱いたい場合は、異なるカラーしきい値を指定してfind_blobsをそれぞれ個別に呼び出してください。
all_blobs = img.find_blobs([red,blue,yellow],merge=True)
red_blobs = img.find_blobs([red],merge=True)
blue_blobs = img.find_blobs([blue],merge=True)
yellow_blobs = img.find_blobs([yellow],merge=True)
- marginはマージン(余裕)です。1に設定すると、2つのブロブの間隔が1ピクセル以内であればマージされます。
しきい値
カラーしきい値の構造は次のとおりです。
red = (minL, maxL, minA, maxA, minB, maxB)
タプル内の値は、それぞれL、A、Bの最小値と最大値です。
IDEの画像からこのしきい値を取得する方法については、10分で始めるクイックスタートを参照してください。
新しいバージョンのIDEには、より便利なしきい値選択ツールが用意されています。以下で説明します。
カラーしきい値選択ツール
OpenMVのIDEにはしきい値選択ツールが追加されており、カラーしきい値のデバッグが非常に簡単になります。
まずhello world.pyを実行し、IDEのフレームバッファに映像を表示させます。\
\
次に、Tools → Mechine Vision → Threshold Editor を開きます。\

Frame Bufferをクリックすると、IDEに表示されている画像を取得できます。また、Image Fileでは任意の画像ファイルを選択できます。

6つのスライダーをドラッグすると、しきい値の処理結果がリアルタイムに表示されます。目指すのは、対象の色を白に、それ以外の色をすべて黒に変換することです。

blobsはリストです
find_blobsは複数のブロブからなるリストを返します。(blobsとblobの違いに注意してください。これは複数のカラーブロックと1つのカラーブロックを区別するための呼び方に過ぎません)。\ リストはC言語の配列に似ています。blobsリストには多数のblobオブジェクトが含まれます。blobオブジェクトはカラーブロックそのものであり、各blobオブジェクトにはそのカラーブロックの情報が格納されています。
blobs = img.find_blobs([red])
blobsは多数のカラーブロックの集まりです。
forループを使うと、すべてのカラーブロックを取り出すことができます。
for blob in blobs:
print(blob.cx)
forループの使い方については、Pythonの基礎知識を参照してください。
blobカラーブロックオブジェクト
blobには複数のメソッドがあります。
blob.rectは、このカラーブロックの外接矩形を返します。矩形はタプル(x, y, w, h)の形式で、image.draw_rectangleにそのまま渡すことができます。
blob.xは、ブロブの外接矩形のx座標(int)を返します。blob[0]からも取得できます。
blob.yは、ブロブの外接矩形のy座標(int)を返します。blob[1]からも取得できます。
blob.wは、ブロブの外接矩形の幅w(int)を返します。blob[2]からも取得できます。
blob.hは、ブロブの外接矩形の高さh(int)を返します。blob[3]からも取得できます。
blob.pixelsは、ブロブ内のピクセル数(int)を返します。blob[4]からも取得できます。
blob.cxは、ブロブの外接矩形の中心のx座標(int)を返します。blob[5]からも取得できます。
blob.cyは、ブロブの外接矩形の中心のy座標(int)を返します。blob[6]からも取得できます。
blob.rotationは、ブロブの回転角度をラジアン(float)で返します。ブロブが鉛筆のような形状であれば、この値は0~180°の範囲になります。ブロブが円形の場合、この値には意味がありません。ブロブに全く対称性がない場合は、0~360°の値が得られます。blob[7]からも取得できます。
blob.codeは16ビットの数値を返し、各ビットが各しきい値に対応します。例えば:
blobs = img.find_blobs([red, blue, yellow], merge=True)
ブロブが赤であればcodeは0001、青であれば0010になります。注意: ブロブはマージされる場合があるため、赤と青が混ざったブロブのcodeは0011になります。この値を使ってカラーコードを判別できます。blob[8]からも取得できます。
blob.countは、merge=Trueの場合に複数のブロブが1つにマージされた際、元々いくつのブロブがマージされたかを返します。merge=Falseの場合、戻り値は常に1です。blob[9]からも取得できます。
blob.areaは、ブロブの外接矩形の面積を返します。これは(w * h)と等しくなります。
blob.densityは、ブロブの密度を返します。これは、ブロブ内のピクセル数を外接矩形の面積で割った値です。密度が低い場合、対象をうまく捉えられていないことを意味します。\ 例えば、赤い円を認識する場合、返されるblob.pixelsは対象の円のピクセル数であり、blob.areaはその円に外接する正方形の面積になります。