色認識とテンプレートマッチングの同時認識
動画チュートリアル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())
プログラムを実行した際の効果は以下の通りです:

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