K210 学習ノート (9) - カラーブロック認識

序文

私がカラーブロック探し、つまり色の認識に初めて触れたのは、前回の技術者研修大会で先輩たちのクルマが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 のカラー ブロック認識と非常に似ており、ほとんどのコードを直接使用できます。

おすすめ

転載: blog.csdn.net/Thousand_drive/article/details/124163791