色認識とテンプレートマッチングの同時認識

動画チュートリアル18 - アルゴリズムの組み合わせ: https://singtown.com/learn/50029/

本節では、色認識とテンプレートマッチングを同時に行う方法を紹介します。赤と緑の数字テンプレートの認識を例にとると、まず色認識を行い、 認識された色領域内でテンプレート認識を行います。

認識対象の画像は以下の通りです:

プログラムを実行する前に、テンプレート画像を SD カードに保存してください。

# 複数色・複数テンプレートマッチングの例
#
# この例では、OpenMV を使用した複数色トラッキングを示します。

import csi, image, time
csi0 = csi.CSI()

from image import SEARCH_EX, SEARCH_DS

# カラートラッキングのしきい値(L Min, L Max, A Min, A Max, B Min, B Max)
# 以下のしきい値は、一般的な赤色/緑色のものを追跡します。必要に応じて調整してください...
thresholds = [(30, 100, 15, 127, 15, 127), # generic_red_thresholds
              (30, 100, -64, -8, -32, 32), # generic_green_thresholds
              (0, 15, 0, 40, -80, -20)] # generic_blue_thresholds
# 色のしきい値は16個を超えないようにしてください
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QQVGA)
csi0.snapshot(time = 2000)
csi0.auto_gain(False) # カラートラッキングのためにオフにする必要がある
csi0.auto_whitebal(False) # カラートラッキングのためにオフにする必要がある
clock = time.clock()

# "pixel_threshold" より多いピクセル数、かつ "area_threshold" より大きい面積を持つ領域のみが
# 以下の "find_blobs" によって返されます。カメラの解像度を変更した場合は、
# "pixels_threshold" と "area_threshold" も変更してください。"merge = True" は、画像内のすべての重なり合った色ブロックを結合します。

templates = ["0.pgm", "1.pgm", "2.pgm", "6.pgm"] # 複数のテンプレートを保存する

while(True):
    clock.tick()
    img = csi0.snapshot()
    for blob in img.find_blobs(thresholds, pixels_threshold=200, area_threshold=200):
        #img.draw_rectangle(blob.rect)
        #img.draw_cross((blob.cx, blob.cy))
        #print(blob.code)

        img = img.to_grayscale()
        for t in templates:
            template = image.Image(t)
            # 各テンプレートを順に処理してテンプレートマッチングを行う
            r = img.find_template(template, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
        # find_template(template, threshold, [roi, step, search])。threshold の
        # 0.7 は類似度のしきい値であり、roi はマッチングを行う領域(左上頂点が (10, 0) で、幅80・高さ60の矩形)です。
        # roi の大きさはテンプレート画像より大きく、フレームバッファより小さくする必要があります。
        # マッチングした画像にマークを付ける
            if r:
                img.draw_rectangle(r, color=0)
                print(blob.code, t) # テンプレート名を表示する
                # 赤色の場合、blob.code==1、緑色の場合、blob.code==2 です。
                # 数字0の場合、t=="0.pgm"、数字1の場合、t=="1.pgm" です。


    #print(clock.fps())

プログラムを実行した際の効果は以下の通りです:

ターミナルでの実行結果の出力:

results matching ""

    No results matching ""