模板匹配是一种用于查找与补丁(模板)相似的图像区域的技术。
它的应用可以是机器人或制造业。
简介
补丁是具有某些功能的小图像。 模板匹配的目的是在图像中找到补丁/模板。

与 OpenCV 和 Python 匹配的模板。 模板(左),结果图像(右)
要找到它们,我们都需要:
源图像(
S):在其中查找匹配项的空间模板图像(
T):模板图像
模板图像T在源图像S上滑动(在源图像上移动),并且程序尝试使用统计信息查找匹配项。
模板匹配示例
让我们看一下代码:
import numpy as npimport cv2image = cv2.imread('photo.jpg')template = cv2.imread('template.jpg')# resize imagesimage = cv2.resize(image, (0,0), fx=0.5, fy=0.5)template = cv2.resize(template, (0,0), fx=0.5, fy=0.5)# Convert to grayscaleimageGray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)templateGray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)# Find templateresult = cv2.matchTemplate(imageGray,templateGray, cv2.TM_CCOEFF)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)top_left = max_loch,w = templateGray.shapebottom_right = (top_left[0] + w, top_left[1] + h)cv2.rectangle(image,top_left, bottom_right,(0,0,255),4)# Show resultcv2.imshow("Template", template)cv2.imshow("Result", image)cv2.moveWindow("Template", 10, 50);cv2.moveWindow("Result", 150, 50);cv2.waitKey(0)
说明
首先,我们使用imread()加载源图像和模板图像。我们调整它们的大小并将其转换为灰度以便更快地进行检测:
image = cv2.imread('photo.jpg')template = cv2.imread('template.jpg')image = cv2.resize(image, (0,0), fx=0.5, fy=0.5)template = cv2.resize(template, (0,0), fx=0.5, fy=0.5)imageGray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)templateGray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
我们使用cv2.matchTemplate(image, template, method)方法查找图像中最相似的区域。第三个参数是统计方法。

为您的应用选择正确的统计方法。TM_CCOEFF(右),TM_SQDIFF(左)
此方法具有六个匹配方法:CV_TM_SQDIFF,CV_TM_SQDIFF_NORMED,CV_TM_CCORR,CV_TM_CCORR_NORMED,CV_TM_CCOEFF和CV_TM_CCOEFF_NORMED。
这是完全不同的统计比较方法
最后,我们获得矩形变量并显示图像。
局限性
模板匹配不是比例不变的,也不是旋转不变的。 这是一种非常基本和直接的方法,可在其中找到最相关的区域。 因此,这种对象检测方法取决于您要构建的应用程序的类型。 对于非比例和旋转变化的输入,此方法效果很好。
