template_matching.py
# この作品はMITライセンスの下で提供されています。
# Copyright (c) 2013-2023 OpenMV LLC. 全著作権所有。
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# テンプレートマッチングの例 - 正規化相互相関 (NCC)
#
# この例では、OpenMV Cam の NCC 機能を使用して
# 画像パッチを画像の一部にマッチングする方法を示します...極めて管理された環境以外では
# NCC はあまり役に立ちません。
#
# 警告: NCC サポートは作り直しが必要です! 現時点でこの機能は
# 実用的なものにするためにかなりの作業が必要です。このスクリプトは、
# この機能が存在することを示すために残されていますが、現状では不十分です。
import time
import csi
import image
from image import SEARCH_EX
csi0 = csi.CSI()
csi0.reset()
csi0.contrast(1)
csi0.gainceiling(16)
# SEARCH_EX を使ったテンプレートマッチングの最大解像度は QQVGA です
csi0.framesize(csi.QQVGA)
# 検索画像を縮小するためにウィンドウを設定できます。
# csi0.window(((640-80)//2, (480-60)//2, 80, 60))
csi0.pixformat(csi.GRAYSCALE)
# テンプレートを読み込みます。
# テンプレートは小さい(例: 32x32 ピクセル)グレースケール画像である必要があります。
template = image.Image("template.pgm")
clock = time.clock()
# テンプレートマッチングを実行
while True:
clock.tick()
img = csi0.snapshot()
# find_template(template, threshold, [roi, step, search])
# ROI: 関心領域のタプル (x, y, w, h)。
# Step: 使用されるループのステップ (y+=step, x+=step)。大きいステップを使うと高速化されます。
# Search は全探索の image.SEARCH_EX か、ダイヤモンド探索の image.SEARCH_DS のいずれかです
#
# 注1: ROI は画像より小さく、テンプレートより大きくなければなりません。
# 注2: ダイヤモンド探索では、step と ROI はどちらも無視されます。
r = img.find_template(
template, 0.70, step=4, search=SEARCH_EX
) # , roi=(10, 0, 60, 60))
if r:
img.draw_rectangle(r)
print(clock.fps())