Saltar al contenido principal

Búsqueda de coincidencias

info

Todo el código de ejemplo se encuentra en Google Colab para su ejecución directa. Si no puedes ejecutar OpenCV localmente, puedes usar Google Colab junto con matplotlib para visualizar imágenes. Además la imagen que se utilizará en los ejemplos son mario.png.

Objetivo

  • Entender qué es la búsqueda de coincidencias y para qué se utiliza en visión por computadora.
  • Aprender a usar cv.matchTemplate() para buscar un patrón en una imagen más grande.
  • Visualizar cómo detectar múltiples coincidencias con un umbral de similitud.
  • Diferenciar los distintos métodos de coincidencia que ofrece OpenCV.

Conceptos clave

  • Template (plantilla): Subimagen o recorte que se quiere encontrar dentro de una imagen más grande.
  • matchTemplate(): Función de OpenCV que compara la plantilla con todas las regiones posibles de la imagen.
  • Mapa de similitud: Imagen de salida donde cada valor representa la similitud entre la plantilla y la región correspondiente.
  • Umbral (threshold): Valor mínimo de similitud para considerar una coincidencia válida.
  • Rectángulo de detección: Se dibuja alrededor de las regiones que cumplen el umbral.

Funciones principales en OpenCV

  • cv.matchTemplate(image, templ, method): Compara una plantilla con una imagen.

    • image: Imagen de entrada (en escala de grises o color).
    • templ: La plantilla a buscar.
    • method: Método de comparación. Ejemplos:
      • cv.TM_CCOEFF
      • cv.TM_CCOEFF_NORMED
      • cv.TM_CCORR
      • cv.TM_CCORR_NORMED
      • cv.TM_SQDIFF
      • cv.TM_SQDIFF_NORMED
  • np.where(condición)
    Devuelve las coordenadas de los valores que cumplen una condición (por ejemplo, similitud >= umbral).

Teoría

El template matching es una técnica de visión por computadora para localizar una subimagen (plantilla) dentro de una imagen mayor.
Se realiza una búsqueda deslizando la plantilla por toda la imagen y comparando en cada posición el grado de similitud.

Características importantes:

  • Es sensible a cambios de escala y rotación: funciona mejor cuando el objeto buscado está en la misma posición y tamaño que la plantilla.
  • Los métodos de comparación (como TM_CCOEFF_NORMED o TM_SQDIFF) determinan cómo se mide la similitud.
  • El resultado es un mapa de similitudes que puede umbralizarse para detectar múltiples coincidencias.

Búsqueda de coincidencias en múltiples objetos

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# Leer imagen y convertir a escala de grises
img = cv.imread("mario.png")
img_copy = img.copy()
img_gray = cv.cvtColor(img_copy, cv.COLOR_BGR2GRAY)

# Selección manual del ROI (coordenadas x,y,w,h)
x, y, w, h = 165, 140, 20, 27
template = img_gray[y:y+h, x:x+w]

# Obtener dimensiones del template
w, h = template.shape[::-1]

# === Template Matching ===
res = cv.matchTemplate(img_gray, template, cv.TM_CCOEFF_NORMED)

# Definir umbral de similitud
threshold = 0.8
loc = np.where(res >= threshold)

# Dibujar rectángulos en coincidencias
for pt in zip(*loc[::-1]):
cv.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)

# Mostrar resultados
plt.figure(figsize=(15, 5))

plt.subplot(1, 3, 1)
plt.imshow(cv.cvtColor(img_copy, cv.COLOR_BGR2RGB))
plt.title("Imagen original")
plt.axis("off")

plt.subplot(1, 3, 2)
plt.imshow(template, cmap="gray")
plt.title("Template")
plt.axis("off")

plt.subplot(1, 3, 3)
plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
plt.title("Detección de coincidencias")
plt.axis("off")

plt.show()