マルチテンプレートマッチング NCC
ビデオチュートリアル8 - NCCテンプレートマッチング: https://singtown.com/learn/49598/
マルチテンプレートマッチングの方法は、基本的に通常のテンプレートマッチングと同じです。事前に複数のテンプレートを保存しておき、それらにアクセスするだけです。以下のコードを使用できます。

# テンプレートマッチングの例 - 正規化相互相関 (NCC)
#
# この例は、OpenMVカメラのNCC機能を使って、画像の一部を画像内の各部分と
# マッチングする方法を示しています…厳密に制御された環境を期待する場合、NCCはあまり万能ではありません。
#
# 警告: NCC のサポートは作り直しが必要です! この機能を実用的にするには、現時点でまだ多くの作業が必要です。
# このスクリプトはこの機能が存在することを改めて示すものですが、現状では不十分です。
import csi
import time, csi, image
csi0 = csi.CSI()
from image import SEARCH_EX, SEARCH_DS
#image モジュールから SEARCH_EX と SEARCH_DS をインポートします。from import を使うことで、
#SEARCH_EX と SEARCH_DS という必要な部分だけをインポートし、image モジュール全体はインポートしません。
# センサーをリセット
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ピクセル)グレースケール画像である必要があります。
templates = ["0.pgm", "1.pgm", "2.pgm", "6.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 はともに無視されます。
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)
print(t) #テンプレート名を出力
#print(clock.fps())
実行結果は以下の図のようになります。

ターミナルでの出力:
