Coincidencia de plantillas usando OpenCV en Python

Manav Narula 15 febrero 2024
  1. Use la función matchTemplate() para realizar la coincidencia de plantillas usando OpenCV en Python
  2. Conclusión
Coincidencia de plantillas usando OpenCV en Python

La biblioteca opencv en Python implementa muchas técnicas y algoritmos. Podemos realizar varias tareas de visión por computadora e inteligencia artificial utilizando esta biblioteca.

Una de las características de esta biblioteca es la coincidencia de plantillas.

Vamos a discutir esta técnica en detalle. La coincidencia de plantillas se refiere a verificar si una pequeña porción de una imagen es parte de otra imagen o no.

Esta pequeña porción (también llamada plantilla) se mueve horizontal y verticalmente sobre la imagen para encontrar la posición más probable de la plantilla. La coincidencia de plantillas usando opencv tiene muchas aplicaciones de la vida real, especialmente la detección de objetos.

Este tutorial demostrará cómo realizar la coincidencia de plantillas utilizando opencv en Python.

Use la función matchTemplate() para realizar la coincidencia de plantillas usando OpenCV en Python

La función matchTemplate() se puede utilizar para encontrar la posición de una plantilla dada en una imagen. Podemos pasar ambas imágenes a esta función, que deslizará la plantilla en ambas direcciones para encontrar la mejor ubicación coincidente.

Se calcula la densidad de píxeles de cada ubicación y la que tiene la mayor densidad (píxel brillante) es la coincidencia más probable. El matchTemplate() utiliza varios métodos y se especifica mediante el parámetro método.

Hay seis en total: TM_CCOEFF, TM_CCOEFF_NORMED, TM_CCORR, TM_CCORR_NORMED, TM_SQDIFF y TM_SQDIFF_NORMED.

Tenga en cuenta que TM_CCORR no se considera una buena opción debido a sus resultados inexactos. Otra cosa a recordar es que para los métodos TM_SQDIFF y TM_SQDIFF_NORMED seleccionamos el valor mínimo.

Esto quedará claro con los ejemplos a continuación.

Ahora que hemos discutido esta función en detalle, observemos un ejemplo de trabajo. La plantilla y la imagen completa se muestran a continuación, seguidas del código y el resultado.

Imagen:

Imagen de procesamiento

Modelo:

Plantilla de procesamiento

import cv2

i = cv2.imread("deftstack.png")
img = cv2.cvtColor(i, cv2.COLOR_BGR2GRAY)
temp = cv2.imread("temp.png", 0)
width, height = temp.shape[::-1]

result = cv2.matchTemplate(img, temp, cv2.TM_CCOEFF)
val_min, val_max, min_loc, max_loc = cv2.minMaxLoc(result)
t_left = max_loc
b_right = (t_left[0] + width, t_left[1] + height)

cv2.rectangle(i, t_left, b_right, 255, 2)
cv2.imshow("Output", i)
cv2.waitKey(0)
cv2.destroyAllWindows()

Producción:

Coincidencia de plantillas usando opencv en Python TM_CCOEFF

Ahora analicemos el código en detalle. Comenzamos leyendo las imágenes requeridas.

Convertimos esta imagen a escala de grises usando la función cvtColor() para convertir imágenes a los espacios de color requeridos. Las imágenes en blanco y negro proporcionan el mejor resultado.

Pasamos la plantilla y la imagen a la función matchTemplate() junto con el método TM_CCOEFF.

Esto devuelve un array numpy. Necesitamos un conjunto de valores de esta matriz para encontrar las coordenadas.

La función minMaxLoc() encuentra los valores mínimo y máximo de un arreglo y sus índices. Usamos la posición del valor máximo para calcular las mejores coordenadas de coincidencia.

Usamos la función rectangle() para dibujar un rectángulo sobre la parte correspondiente. A continuación, se muestra la imagen con el resultado.

Las funciones waitKey() y destroyAllWindows() evitan que la ventana de salida se cierre automáticamente y esperan alguna entrada del usuario.

Como se discutió, podemos usar los otros métodos discutidos dentro de la función matchTemplate() de manera similar. La única diferencia está asociada a los métodos TM_SQDIFF y TM_SQDIFF_NORMED.

Podemos usarlos haciendo un ligero ajuste en nuestro código. Vea el siguiente ejemplo.

import cv2

i = cv2.imread("deftstack.png")
img = cv2.cvtColor(i, cv2.COLOR_BGR2GRAY)
temp = cv2.imread("temp.png", 0)
width, height = temp.shape[::-1]

result = cv2.matchTemplate(img, temp, cv2.TM_SQDIFF)
val_min, val_max, min_loc, max_loc = cv2.minMaxLoc(result)
t_left = min_loc
b_right = (t_left[0] + width, t_left[1] + height)

cv2.rectangle(i, t_left, b_right, 255, 2)
cv2.imshow("Output", i)
cv2.waitKey(0)
cv2.destroyAllWindows()

Producción:

Coincidencia de plantillas usando opencv en python TM_SQDIFF

El ejemplo anterior muestra que usamos el índice de valor mínimo para calcular las coordenadas de la plantilla. El código restante sigue siendo el mismo.

Conclusión

Este tutorial demostró la técnica de coincidencia de plantillas utilizando opencv en Python. Discutimos los conceptos básicos de la coincidencia de plantillas y la función en la biblioteca opencv que implementa esta técnica.

También se discutieron los diversos métodos asociados con la función. Vimos un ejemplo de trabajo en vivo de esta técnica usando esta y varias otras funciones.

Se discutió en detalle destacando el propósito de cada línea.

Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn