Opencv Python 简明教程

OpenCV Python - Template Matching

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

Cv.matchTemplate() 函数在 OpenCV 中定义用作此目的,对该函数的命令如下所示:

cv.matchTemplate(image, templ, method)

其中 image 为输入图像,其中要查找 templ(模板)模式。method 参数采用以下值之一 −

  1. cv.TM_CCOEFF,

  2. cv.TM_CCOEFF_NORMED, cv.TM_CCORR,

  3. cv.TM_CCORR_NORMED,

  4. cv.TM_SQDIFF,

  5. cv.TM_SQDIFF_NORMED

此方法使模板图像在输入图像上滑动。这与卷积的过程相似,并将输入图像下的模板和补丁与模板图像进行比较。

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

Example

在下面的示例中,将印度板球队队员 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)

Output

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

Original image

template matching

template 如下所示 −

templates

matched with template 时,图像如下 −

matched templates