カラーブロックの検出

ビデオチュートリアル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はその円に外接する正方形の面積になります。

results matching ""

    No results matching ""