序文
私がカラーブロック探し、つまり色の認識に初めて触れたのは、前回の技術者研修大会で先輩たちのクルマがopenmvを使っているのを見て、最初はすごいなと思いました。 、どうやって色認識を実現しているのでしょうか??MAIX BIT (K210) との接触を経て、ようやくカラー ブロック認識について予備的な理解が得られました。
MAIX BIT (K210) は openmv を改造しているため、カラーブロック認識など一部の使用方法は同様です。openmv のカラーブロック認識については、こちらをご覧ください。
1. しきい値
1. 構造
色のしきい値の構造は次のようになります。
red = (minL, maxL, minA, maxA, minB, maxB)
タプル内の値はそれぞれ LAB の最大値と最小値です。
2.IDEが認識色を指定します
1.
IED でしきい値エディタを開きます
2. カラー画像のソースを選択します
IDE を実行するフレーム バッファを選択し、認識したいカラーをバッファ内に保持します 画像
ファイルの場合は、しきい値を追跡し、
識別したい色をハイライト(白)に調整します。その後に表示されるしきい値が、識別したい色のしきい値です。それをコピーしてください。
2 番目に、コンストラクター
1.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=sensor.snapshot()
red_blobs = img.find_blobs([red])
color_blobs = img.find_blobs([red,blue, yellow])
roi は「関心領域」です。詳細については、こちらをご覧ください。
例えば:
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 merge を True に設定すると、重複するすべての BLOB が 1 つにマージされます。
注: これにより、色に関係なく、すべての BLOB がマージされます。複数の色の blob を混同したい場合は、異なる色のしきい値を指定して 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)
マージン境界を 1 に設定すると、距離が 1 ピクセルであれば 2 つのブロブもマージされます。
2. 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 ビットの数値を返します。各ビットは各しきい値に対応します。例: blob = img.find_blobs([red, blue, yellow], merge=True) 。カラーブロックが赤の場合、そのコードは 0001、青の場合、そのコードは 0010 です。注: BLOB はマージできます。赤と青の BLOB の場合、BLOB は 0011 です。この機能を使用して、カラーコードを検索できます。blob[8] を通じて取得することもできます。 |
blob.count() | merge=True の場合、複数の BLOB が 1 つの BLOB にマージされ、この関数はこの数値を返します。merge=False の場合、戻り値は常に 1 です。blob[9] を通じて取得することもできます。 |
blob.area() | パッチの境界ボックスの面積を返します。(w * h) に等しい必要があります |
blob.density() | パッチの密度を返します。これは、カラーパッチのピクセル数を外枠の面積で割ったものに等しくなります。密度が低い場合、ターゲットは適切にロックされていません。たとえば、赤い円を識別する場合、返される blob.pixels() はターゲット円のピクセル数、blob.area() は円の外接正方形の面積です。 |
3. 使用方法
MaixPy は、画像モジュール内のカラー パッチを見つける方法をすでに実装していますが、これには最小以外のファームウェア バージョンが必要です。ここをクリックしてダウンロードしてください。
1. 緑を識別する
ルーティーン:
#初始化
import sensor
import image
import lcd
import time
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
green_threshold = (70, 46, -128, 127, -128, 127)
while True:
img=sensor.snapshot()
blobs = img.find_blobs([green_threshold])
if blobs:
for b in blobs:
tmp=img.draw_rectangle(b[0:4])##在图像上绘制一个矩形。
tmp=img.draw_cross(b[5], b[6])##画十字交叉
lcd.display(img)
実行結果:
最大ビットの色認識
要約する
MAIX BIT (K210) のカラー ブロック認識は、openmv のカラー ブロック認識と非常に似ており、ほとんどのコードを直接使用できます。