Reconocimiento de objetos con OpenCV

En el campo de la visión por computadora, el reconocimiento de objetos es una tarea muy importante.

OpenCV es una potente biblioteca de visión por computadora de código abierto que ofrece múltiples métodos para realizar el reconocimiento de objetos.

Este artículo explicará en detalle cómo utilizar el método de emparejamiento de plantillas de OpenCV (cv2.matchTemplate()) para realizar el reconocimiento de objetos.

¿Qué es el emparejamiento de plantillas?

El emparejamiento de plantillas es una técnica que busca la región más similar a una imagen de plantilla dada dentro de una imagen.

En términos sencillos, el emparejamiento de plantillas consiste en encontrar en una imagen grande la parte que mejor coincide con la imagen de plantilla (es decir, el objeto que queremos reconocer). Este método es adecuado para casos en los que el tamaño, la orientación y la forma del objeto en la imagen no cambian sustancialmente.

  • Imagen de plantilla:Fragmento de imagen del objeto objetivo.

  • Imagen de búsqueda:La imagen que se va a inspeccionar.

  • Resultado del emparejamiento:Representa la distribución de similitud de la imagen de plantilla dentro de la imagen de búsqueda.

Principio básico del emparejamiento de plantillas

El principio básico del emparejamiento de plantillas es deslizar la imagen de plantilla sobre la imagen objetivo, calcular la similitud en cada posición y encontrar la posición con mayor similitud. OpenCV proporciona varios métodos de cálculo de similitud, como el emparejamiento por diferencia de cuadrados (cv2.TM_SQDIFF), emparejamiento por diferencia de cuadrados normalizada (cv2.TM_SQDIFF_NORMED), emparejamiento por correlación (cv2.TM_CCORR), emparejamiento por correlación normalizada (cv2.TM_CCORR_NORMED), emparejamiento por coeficiente de correlación (cv2.TM_CCOEFF) y emparejamiento por coeficiente de correlación normalizado (cv2.TM_CCOEFF_NORMED)。

Escenarios de aplicación

  • Reconocimiento de objetos: se utiliza para localizar objetos específicos en una imagen, como logotipos, iconos, etc.
  • Seguimiento de objetos: se utiliza para rastrear objetos objetivo en video.
  • Registro de imágenes: se utiliza para alinear dos imágenes.

Pasos para implementar el emparejamiento de plantillas

  1. Cargar la imagen:Leer la imagen de búsqueda y la imagen de plantilla.

  2. Emparejamiento de plantillas:Usarcv2.matchTemplate()para buscar la imagen de plantilla en la imagen de búsqueda.

  3. Obtener el resultado del emparejamiento:Usarcv2.minMaxLoc()para obtener la mejor posición de coincidencia.

  4. Dibujar el resultado del emparejamiento:Dibujar el área coincidente en la imagen de búsqueda.

  5. Mostrar el resultado:Mostrar el resultado del emparejamiento.

Métodos de emparejamiento

OpenCV ofrece varios métodos de emparejamiento de plantillas, que se pueden especificar mediante el tercer parámetro de cv2.matchTemplate():

MétodoDescripción
cv2.TM_SQDIFFEmparejamiento por diferencia de cuadrados: cuanto menor sea el valor, mayor será la coincidencia.
cv2.TM_SQDIFF_NORMEDEmparejamiento por diferencia de cuadrados normalizada: cuanto menor sea el valor, mayor será la coincidencia.
cv2.TM_CCORREmparejamiento por correlación: cuanto mayor sea el valor, mayor será la coincidencia.
cv2.TM_CCORR_NORMEDEmparejamiento por correlación normalizada: cuanto mayor sea el valor, mayor será la coincidencia.
cv2.TM_CCOEFFEmparejamiento por coeficiente de correlación: cuanto mayor sea el valor, mayor será la coincidencia.
cv2.TM_CCOEFF_NORMEDEmparejamiento por coeficiente de correlación normalizado: cuanto mayor sea el valor, mayor será la coincidencia.

Usocv2.matchTemplate()para el reconocimiento de objetos

1. Importar las bibliotecas necesarias

Primero, necesitamos importar las bibliotecas OpenCV y NumPy.

NumPy es una biblioteca fundamental para la computación científica en Python; OpenCV utiliza arreglos de NumPy para almacenar datos de imagen.

Ejemplo

import cv2
import numpy as np

2. Cargar la imagen y la plantilla

A continuación, necesitamos cargar la imagen objetivo y la imagen de plantilla.

La imagen objetivo es la imagen en la que buscamos el objeto; la imagen de plantilla es el objeto que queremos reconocer.

Ejemplo

# Cargar la imagen objetivo y la imagen de plantilla
img = cv2.imread('target_image.jpg', 0)
template = cv2.imread('template_image.jpg', 0)

3. Obtener el tamaño de la imagen de la plantilla

Para deslizar la imagen de plantilla sobre la imagen objetivo, necesitamos conocer el ancho y la altura de la imagen de plantilla.

Ejemplo

# Obtener el tamaño de la imagen de la plantilla
w, h = template.shape[::-1]

4. Realizar el emparejamiento de plantillas

Usarcv2.matchTemplate()la función para realizar el emparejamiento de plantillas.

Esta función devuelve una matriz de resultados, donde cada elemento representa la similitud entre la posición correspondiente en la imagen objetivo y la imagen de plantilla.

Ejemplo

# Realizar el emparejamiento de plantillas
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)

5. Establecer un umbral de coincidencia y encontrar la posición coincidente

Podemos establecer un umbral para determinar si la coincidencia es exitosa.

Luego, usarcv2.minMaxLoc()la función para encontrar la posición de los valores máximo y mínimo en la matriz de resultados.

Ejemplo

# Establecer un umbral de coincidencia
threshold = 0.8

# Encontrar la posición coincidente
loc = np.where(res >= threshold)

6. Marcar la posición coincidente en la imagen objetivo

Finalmente, podemos marcar en la imagen objetivo la posición que coincide con la plantilla.

Por lo general, usamos un rectángulo para marcar el área coincidente.

Ejemplo

# Marcar la posición coincidente en la imagen objetivo
for pt in zip(*loc[::-1]):
    cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)

# Mostrar la imagen resultante
cv2.imshow('Matched Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Código completo

El siguiente es un ejemplo de código completo que muestra cómo usarcv2.matchTemplate()para realizar el reconocimiento de objetos.

Ejemplo

import cv2
import numpy as np

# Cargar la imagen objetivo y la imagen de plantilla
img = cv2.imread('target_image.jpg', 0)
template = cv2.imread('template_image.jpg', 0)

# Obtener el tamaño de la imagen de la plantilla
w, h = template.shape[::-1]

# Realizar el emparejamiento de plantillas
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)

# Establecer un umbral de coincidencia
threshold = 0.8

# Encontrar la posición coincidente
loc = np.where(res >= threshold)

# Marcar la posición coincidente en la imagen objetivo
for pt in zip(*loc[::-1]):
    cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)

# Mostrar la imagen resultante
cv2.imshow('Matched Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Otras extensiones