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
Cargar la imagen:Leer la imagen de búsqueda y la imagen de plantilla.
Emparejamiento de plantillas:Usar
cv2.matchTemplate()para buscar la imagen de plantilla en la imagen de búsqueda.Obtener el resultado del emparejamiento:Usar
cv2.minMaxLoc()para obtener la mejor posición de coincidencia.Dibujar el resultado del emparejamiento:Dibujar el área coincidente en la imagen de búsqueda.
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étodo | Descripción |
|---|---|
cv2.TM_SQDIFF | Emparejamiento por diferencia de cuadrados: cuanto menor sea el valor, mayor será la coincidencia. |
cv2.TM_SQDIFF_NORMED | Emparejamiento por diferencia de cuadrados normalizada: cuanto menor sea el valor, mayor será la coincidencia. |
cv2.TM_CCORR | Emparejamiento por correlación: cuanto mayor sea el valor, mayor será la coincidencia. |
cv2.TM_CCORR_NORMED | Emparejamiento por correlación normalizada: cuanto mayor sea el valor, mayor será la coincidencia. |
cv2.TM_CCOEFF | Emparejamiento por coeficiente de correlación: cuanto mayor sea el valor, mayor será la coincidencia. |
cv2.TM_CCOEFF_NORMED | Emparejamiento 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 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
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
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
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
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
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 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()