OpenCV Python - 模板匹配

模板匹配技术用于检测图像中与样本或模板图像匹配的一个或多个区域。

OpenCV 中的

Cv.matchTemplate() 函数就是为此而定义的,其命令如下:

cv.matchTemplate(image, templ, method)

其中image是输入图像,templ(模板)图案要位于的位置。 method 参数采用以下值之一 −

  • cv.TM_CCOEFF,
  • cv.TM_CCOEFF_NORMED, cv.TM_CCORR,
  • cv.TM_CCORR_NORMED,
  • cv.TM_SQDIFF,
  • cv.TM_SQDIFF_NORMED

此方法将模板图像滑动到输入图像上。 这是一个类似于卷积的过程,比较模板图像下输入图像的模板和补丁。

它返回一个灰度图像,其每个像素表示它与模板的匹配程度。 如果输入图像的大小为 (WxH),模板图像的大小为 (wxh),则输出图像的大小为 (W-w+1, H-h+1)。 因此,该矩形是您的模板区域。


示例

在下面的示例中,一张印有 Virat Kohli 脸部的图像被用作模板,以与另一幅描绘他与 M.S.Dhoni 合影的图像相匹配。

以下程序使用 80% 的阈值并在匹配的人脸周围绘制一个矩形 −

import cv2
import numpy as np

img = cv2.imread('Dhoni-and-Virat.jpg',1)
cv2.imshow('Original',img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

template = cv2.imread('virat.jpg',0)
cv2.imshow('Template',template)
w,h = template.shape[0], template.shape[1]

matched = cv2.matchTemplate(gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8

loc = np.where( matched >= threshold)

for pt in zip(*loc[::-1]):
   cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0,255,255), 2)

cv2.imshow('Matched with Template',img)

输出

结果的原图、模板和匹配图如下 −

原始图片

模板匹配

模板如下所示 −

模板

匹配模板时的图片如下 −

匹配的模板