Correspondência de vários modelos NCC
Tutorial em vídeo 8 - Correspondência de modelos NCC: https://singtown.com/learn/49598/
O método de correspondência de vários modelos é basicamente igual ao da correspondência de modelos. Só precisa de guardar e aceder a vários modelos com antecedência. Pode utilizar o seguinte código.

# Template Matching Example - Normalized Cross Correlation (NCC)
#
# Este exemplo mostra como usar a funcionalidade NCC da câmara OpenMV para
# corresponder pequenos trechos de imagem a várias partes de uma imagem...
# exceto em ambientes extremamente controlados, o NCC não é muito útil.
#
# AVISO: o suporte a NCC precisa de ser reformulado! Atualmente, esta
# funcionalidade ainda precisa de muito trabalho para se tornar útil. Este
# script permanece para mostrar que a funcionalidade existe, mas, no seu
# estado atual, é inadequada.
import csi
import time, csi, image
csi0 = csi.CSI()
from image import SEARCH_EX, SEARCH_DS
#Importa SEARCH_EX e SEARCH_DS do módulo image. Usando from import, importamos
#apenas as partes necessárias, SEARCH_EX e SEARCH_DS, sem importar o módulo image inteiro.
# Reinicia o sensor
csi0.reset()
# Define as definições do sensor
csi0.contrast(1)
csi0.gainceiling(16)
# A resolução máxima para correspondência de modelos com SEARCH_EX é QQVGA
csi0.framesize(csi.QQVGA)
# Pode definir uma janela para reduzir a imagem de pesquisa.
#csi0.window(((640-80)//2, (480-60)//2, 80, 60))
csi0.pixformat(csi.GRAYSCALE)
# Carrega o modelo.
# O modelo deve ser uma imagem pequena (ex. 32x32 pixels) em escala de cinza.
templates = ["0.pgm", "1.pgm", "2.pgm", "6.pgm"] #guarda vários modelos
#carrega as imagens dos modelos
clock = time.clock()
# Executa a correspondência de modelos
while (True):
clock.tick()
img = csi0.snapshot()
# find_template(template, threshold, [roi, step, search])
# ROI: o tuplo da região de interesse (x, y, w, h).
# Step: o passo do ciclo usado (y+=step, x+=step); use um passo maior para acelerar.
# Search é image.SEARCH_EX para pesquisa exaustiva ou image.SEARCH_DS para pesquisa em diamante
#
# Nota 1: o ROI tem de ser menor que a imagem e maior que o modelo.
# Nota 2: na pesquisa em diamante, step e ROI são ambos ignorados.
for t in templates:
template = image.Image(t)
#percorre cada modelo para efetuar a correspondência
r = img.find_template(template, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
#find_template(template, threshold, [roi, step, search]); no threshold,
#o 0.7 é o limiar de semelhança, roi é a área de correspondência (vértice superior esquerdo em (10, 0), retângulo com 80 de comprimento e 60 de largura),
#note que o tamanho do roi deve ser maior que a imagem do modelo e menor que o framebuffer.
#marca a imagem correspondida
if r:
img.draw_rectangle(r)
print(t) #imprime o nome do modelo
#print(clock.fps())
O efeito de execução é o seguinte, como mostrado na figura:

Saída no terminal:
