Reconhecimento simultâneo de correspondência de cor e modelo
Tutorial em vídeo 18 - Combinação de algoritmos: https://singtown.com/learn/50029/
Esta seção mostra como realizar reconhecimento de cor e correspondência de modelo simultaneamente. Vamos usar o reconhecimento de modelos digitais vermelhos e verdes como exemplo. Primeiro, realizamos o reconhecimento de cor, e depois realizamos o reconhecimento de modelo na área de cor reconhecida.
Nossa imagem de reconhecimento é a seguinte:

Antes de executar o programa, salve nossa imagem de modelo no cartão SD.

# Exemplo de correspondência de múltiplas cores e múltiplos modelos
#
# Este exemplo mostra o rastreamento multicolorido usando a OpenMV.
import csi, image, time
csi0 = csi.CSI()
from image import SEARCH_EX, SEARCH_DS
# Limiares de rastreamento de cor (L Min, L Max, A Min, A Max, B Min, B Max)
# Os limiares abaixo rastreiam objetos geralmente vermelhos/verdes. Sinta-se livre para ajustá-los...
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
# Não ultrapasse 16 limiares de cor
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QQVGA)
csi0.snapshot(time = 2000)
csi0.auto_gain(False) # must be turned off for color tracking
csi0.auto_whitebal(False) # must be turned off for color tracking
clock = time.clock()
# Apenas áreas com mais pixels que "pixel_threshold" e mais área que
# "area_threshold" são retornadas pelo "find_blobs" abaixo. Se você mudar
# a resolução da câmera, altere "pixels_threshold" e "area_threshold".
# "merge = True" mescla todos os blocos de cor sobrepostos na imagem.
templates = ["0.pgm", "1.pgm", "2.pgm", "6.pgm"] # armazena múltiplos modelos
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)
# percorre cada modelo para fazer a correspondência de modelo
r = img.find_template(template, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
# find_template(template, threshold, [roi, step, search]); o 0.7 em
# threshold é o limiar de similaridade; roi é a área onde a
# correspondência é realizada (retângulo com vértice superior
# esquerdo em (10,0), largura 80 e altura 60); observe 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, color=0)
print(blob.code, t) # imprime o nome do modelo
# se for vermelho, blob.code==1; se for verde, blob.code==2.
# se for o dígito 0, t=="0.pgm"; se for o dígito 1, t=="1.pgm".
#print(clock.fps())
O efeito da execução do programa é o seguinte:

A saída do resultado da execução no terminal:
