模板匹配是一种用于查找与补丁(模板)相似的图像区域的技术。
它的应用可以是机器人或制造业。
简介
补丁是具有某些功能的小图像。 模板匹配的目的是在图像中找到补丁/模板。
与 OpenCV 和 Python 匹配的模板。 模板(左),结果图像(右)
要找到它们,我们都需要:
源图像(
S
):在其中查找匹配项的空间模板图像(
T
):模板图像
模板图像T
在源图像S
上滑动(在源图像上移动),并且程序尝试使用统计信息查找匹配项。
模板匹配示例
让我们看一下代码:
import numpy as np
import cv2
image = cv2.imread('photo.jpg')
template = cv2.imread('template.jpg')
# resize images
image = 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 grayscale
imageGray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
templateGray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
# Find template
result = cv2.matchTemplate(imageGray,templateGray, cv2.TM_CCOEFF)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
top_left = max_loc
h,w = templateGray.shape
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(image,top_left, bottom_right,(0,0,255),4)
# Show result
cv2.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
。
这是完全不同的统计比较方法
最后,我们获得矩形变量并显示图像。
局限性
模板匹配不是比例不变的,也不是旋转不变的。 这是一种非常基本和直接的方法,可在其中找到最相关的区域。 因此,这种对象检测方法取决于您要构建的应用程序的类型。 对于非比例和旋转变化的输入,此方法效果很好。