[oepncv] Coincidencia de plantillas (simplemente deslice la imagen de la plantilla sobre la imagen de entrada (como en la convolución 2D), coincidencia de plantillas para múltiples objetos)

4_12_Coincidencia de plantillas: documentación oficial china de OpenCV

 Encuentre objetos en una imagen utilizando la coincidencia de plantillas: verá las siguientes funciones: cv.matchTemplate (), cv.minMaxLoc () 

Resumen 

  • La coincidencia de plantillas es un método para buscar y encontrar la ubicación de imágenes de plantillas en imágenes más grandes .
  • OpenCV viene con una función **cv.matchTemplate**(). Simplemente desliza la imagen de la plantilla sobre la imagen de entrada (como en la convolución 2D) y luego compara la plantilla y el rompecabezas de la imagen de entrada debajo de la imagen de la plantilla.

contenido

 teoría

Coincidencia de plantillas en OpenCV

Coincidencia de plantillas para varios objetos


 

 teoría

La coincidencia de plantillas es un método para buscar y encontrar la ubicación de imágenes de plantillas en imágenes más grandes . Para este propósito, OpenCV viene con una función **cv.matchTemplate**(). Simplemente desliza la imagen de la plantilla sobre la imagen de entrada (como en la convolución 2D) y luego compara la plantilla y el rompecabezas de la imagen de entrada debajo de la imagen de la plantilla. Varios métodos de comparación están implementados en OpenCV. (Puede consultar la documentación para más detalles). Devuelve una imagen en escala de grises donde cada píxel representa qué tan bien el vecindario de ese píxel coincide con la plantilla.

Si el tamaño de la imagen de entrada es (WxH), y el tamaño de la imagen de la plantilla es (wxh), entonces el tamaño de la imagen de salida será (W-w + 1,H-h + 1). Después de obtener el resultado, puede usar la función **cv.minMaxLoc**() para encontrar dónde está el máximo/mínimo. Conviértalo en la esquina superior izquierda del rectángulo, y (w,h)el ancho y alto del rectángulo. Este rectángulo es el área de tu plantilla.

Tenga en cuenta que  si se utiliza cv.TM_SQDIFF como método de comparación, el valor más pequeño proporciona la mejor coincidencia.

Coincidencia de plantillas en OpenCV

Como ejemplo, buscaremos la cara de Messi en una foto. Así que creé una plantilla como esta: 

 Probaremos todos los métodos de comparación para ver cómo resultan:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',0)
img2 = img.copy()
template = cv.imread('template.jpg',0)
w, h = template.shape[::-1]
# 列表中所有的6种比较方法
methods = ['cv.TM_CCOEFF', 'cv.TM_CCOEFF_NORMED', 'cv.TM_CCORR',
            'cv.TM_CCORR_NORMED', 'cv.TM_SQDIFF', 'cv.TM_SQDIFF_NORMED']
for meth in methods:
    img = img2.copy()
    method = eval(meth)
    # 应用模板匹配
    res = cv.matchTemplate(img,template,method)
    min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
    # 如果方法是TM_SQDIFF或TM_SQDIFF_NORMED,则取最小值
    if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)
    cv.rectangle(img,top_left, bottom_right, 255, 2)
    plt.subplot(121),plt.imshow(res,cmap = 'gray')
    plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
    plt.subplot(122),plt.imshow(img,cmap = 'gray')
    plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
    plt.suptitle(meth)
    plt.show()

Echa un vistazo a los siguientes resultados:

  • cv.TM_CCOEFF

  • cv.TM_CCOEFF_NORMED 

  • cv.TM_CCORR 

  • cv.TM_CCORR_NORMED 

  • cv.TM_SQDIFF 

  • cv.TM_SQDIFF_NORMED 

Como puede ver, los resultados de usar **cv.TM_CCORR** no son ideales.

Coincidencia de plantillas para varios objetos

En el apartado anterior buscamos en la imagen la cara de Messi, que aparecía una sola vez en la imagen. Asumiendo que está buscando objetos con múltiples ocurrencias, **cv.minMaxLoc**() no le dará todas las ubicaciones. En este caso, utilizaremos umbrales . Entonces, en este ejemplo, usaremos una captura de pantalla del famoso juego **Mario** y encontraremos las monedas en él.

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img_rgb = cv.imread('mario.png')
img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
template = cv.imread('mario_coin.png',0)
w, h = template.shape[::-1]
res = cv.matchTemplate(img_gray,template,cv.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
    cv.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
cv.imwrite('res.png',img_rgb)

resultado:

Supongo que te gusta

Origin blog.csdn.net/dujuancao11/article/details/122451051
Recomendado
Clasificación