Fundamentos da Correspondência de Modelos
A correspondência de modelos (template matching) é uma técnica essenical na visão computacional para localizar regiões dentro de uma imagem principal que apresentem alta similaridade com um padrão de referência. O processo utiliza uma janela deslizante que percorre a imagem de entrada, computando um índice de similaridade ou diferença para cada posição. A coordenada onde o índice atinge o extremo esperado (mínimo ou máximo, conforme o algoritmo) aponta para a localização mais provável do alvo.
Mecânica da Função cv2.matchTemplate
O OpenCV implementa essa operação via matchTemplate, que recebe a imagem base, o padrão de busca e um identificador que define a métrica matemática de comparação. A função retorna uma matriz de resposta com dimensões reduzidas, onde cada pixel representa o valor da métrica calculado naquela posição da varredura.
Os principais critérios de avaliação disponíveis alteram a interpretação dos valores extremos:
cv2.TM_SQDIFFecv2.TM_SQDIFF_NORMED: Baseados na soma dos quadrados das diferenças. Valores趋近于 zero indicam ajuste perfeito.cv2.TM_CCORRecv2.TM_CCORR_NORMED: Utilizam correlação cruzada. Picos elevados representam maior correspondência.cv2.TM_CCOEFFecv2.TM_CCOEFF_NORMED: Computam o coeficiente de correlação de Pearson. Valores próximos de 1 refletem alta similaridade estrutural e robustez a variações de brilho.
Implementação Básica com Diferença Quadrática
O primeiro exemplo ilustra o fluxo completo: carregamento em escala de cinza, execução do algoritmo de diferença quadrática, extração do ponto de mínimo e delimitação visual da região encontrada.
import cv2
import numpy as np
import matplotlib.pyplot as plt
# Carregamento das matrizes de imagem
img_base = cv2.imread('referencia_512.png', cv2.IMREAD_GRAYSCALE)
padrao_ref = cv2.imread('segmento_alvo.png', cv2.IMREAD_GRAYSCALE)
alt_p, larg_p = padrao_ref.shape
matriz_saida = cv2.matchTemplate(img_base, padrao_ref, cv2.TM_SQDIFF)
# Extração das coordenadas de melhor casamento
_, _, local_min, _ = cv2.minMaxLoc(matriz_saida)
coord_inicial = local_min
coord_final = (local_min[0] + larg_p, local_min[1] + alt_p)
# Anotação da região detectada
cv2.rectangle(img_base, coord_inicial, coord_final, 255, 2)
# Renderização dos resultados
fig, eixos = plt.subplots(1, 2, figsize=(10, 5))
eixos[0].imshow(matriz_saida, cmap='gray')
eixos[0].set_title('Mapa de Resposta (SQDIFF)')
eixos[1].imshow(img_base, cmap='gray')
eixos[1].set_title('Região Identificada')
for ax in eixos:
ax.axis('off')
plt.tight_layout()
plt.show()
Comparação Automatizada de Algoritmos
Para sleecionar o método mais adequado a diferentes condições de cena, é possível iterar sobre todos os critérios disponíveis. A função auxiliar abaixo encapsula a lógica de seleção de coordenadas e geração dos gráficos, facilitando a análise lado a lado.
import cv2
import matplotlib.pyplot as plt
def analisar_metodos(imagem, padrao, nome_metodo, id_metodo):
copia_visual = imagem.copy()
resposta = cv2.matchTemplate(imagem, padrao, id_metodo)
_, _, idx_min, idx_max = cv2.minMaxLoc(resposta)
h, w = padrao.shape
# Definição dinâmica da origem baseada na métrica
origem = idx_min if id_metodo in (cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED) else idx_max
destino = (origem[0] + w, origem[1] + h)
cv2.rectangle(copia_visual, origem, destino, 255, 2)
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.imshow(copia_visual, cmap='gray')
plt.title(f'Localização: {nome_metodo}')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.imshow(resposta, cmap='viridis')
plt.title('Intensidade da Resposta')
plt.axis('off')
plt.tight_layout()
plt.show()
# Configuração dos dados
caminho_fonte = 'alvo_completo.jpg'
caminho_modelo = 'modelo_busca.jpg'
img_processada = cv2.imread(caminho_fonte, cv2.IMREAD_GRAYSCALE)
padrao_modelo = cv2.imread(caminho_modelo, cv2.IMREAD_GRAYSCALE)
# Dicionário de mapeamento de estratégias
estrategias = {
'TM_SQDIFF': cv2.TM_SQDIFF,
'TM_SQDIFF_NORMED': cv2.TM_SQDIFF_NORMED,
'TM_CCORR': cv2.TM_CCORR,
'TM_CCORR_NORMED': cv2.TM_CCORR_NORMED,
'TM_CCOEFF': cv2.TM_CCOEFF,
'TM_CCOEFF_NORMED': cv2.TM_CCOEFF_NORMED
}
# Execução sequencial da avaliação
for nome, ident in estrategias.items():
analisar_metodos(img_processada, padrao_modelo, nome, ident)