目录:
- 1.模板匹配原理
- 2.模板匹配操作
- 1)单对象匹配:原图中仅有一个与模板匹配
- 2)多对象匹配:原图中有多个与模板匹配
一、模板匹配原理
模板匹配:用来在一幅大图中搜索查找模板图像位置的方法。
OpenCV中提供的模板匹配函数:cv2.matchTemplate()
。
其原理和2D卷积一样,将模板图像在输入图像(大图)上滑动,每移动到一处就将模板与对应的一部分输入图像进行比较(OpenCV提供了几种不同的比较方法),比较后得到一个灰度像素值,该像素值表示此区域与模板的匹配程度。
当输入图像大小为(W × H),模板大小为(w × h)时,模板匹配后得到的灰度图的大小为(W+1-w, H+1-h)。我们得到这幅图之后,就可以根据 cv2.minMaxLoc()
来找到其中的最小值和最大值及相应匹配位置。
二、模板匹配操作
OpenCV的模板匹配流程:
1)模板匹配,得到匹配灰度图
res = cv2.matchTemplate(image, templ, method, result=None, mask=None)
参数:
image: 输入图像
templ: 模板图像
method: 模板匹配方法,包括:
cv2.TM_CCOEFF、cv2.TM_CCOEFF_NORMED、
cv2.TM_CCORR、cv2.TM_CCORR_NORMED、
cv2.TM_SQDIFF、cv2.TM_SQDIFF_NORMED
注意不同匹配方法的区别:
1)cv2.TM_CCOEFF_NORMED相比于cv2.TM_CCOEFF,将匹配值归一化到[0, 1],1表示100%匹配。
2)若方法是cv2.TM_SQDIFF或cv2.TM_SQDIFF_NORMED,最小值对应的位置才是最匹配的区域。
2)获取最小和最大像素值及它们的位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
3)最后,将匹配的区域标记出来
cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
1)单对象匹配:原图中仅有一个与模板匹配
# 1.单对象匹配:原图中仅有一个与模板匹配
import cv2
img = cv2.imread("image/9.jpg")
template = cv2.imread("image/18.jpg")
h, w, c = template.shape
# 1)匹配模板,得到匹配灰度图
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF) # 最大值是最匹配区域
# res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED) # 归一化[0, 1],1表示100%匹配
# res = cv2.matchTemplate(img, template, cv2.TM_CCORR) # 最大值是最匹配区域
# res = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED) # 归一化[0, 1],1表示100%匹配
# res = cv2.matchTemplate(img, template, cv2.TM_SQDIFF) # 最小值是最匹配区域
# res = cv2.matchTemplate(img, template, cv2.TM_SQDIFF_NORMED) # 归一化[0, 1],0表示100%匹配
# 2)获取最小和最大像素值及它们的位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
print(max_loc)
# 3)最后,将匹配的区域标记出来
# 匹配类型是TM_CCOEFF、TM_CCOEFF_NORMED、TM_CCORR、TM_CCORR_NORMED时,最大值是最匹配区域
cv2.rectangle(img, (max_loc[0], max_loc[1]), (max_loc[0] + w, max_loc[1] + h), color=(0, 0, 255), thickness=2)
# 匹配类型是TM_SQDIFF、TM_SQDIFF_NORMED时,最大值是最匹配区域
# cv2.rectangle(img, (min_loc[0], min_loc[1]), (min_loc[0] + w, min_loc[1] + h), color=(0, 0, 255), thickness=2)
cv2.imshow("img", img)
cv2.imshow("template", template)
cv2.waitKey(0)
cv2.destroyWindow()

2)多对象匹配:原图中有多个与模板匹配
# 2.多对象匹配:原图中有多个与模板匹配
import cv2
import numpy
img = cv2.imread("image/19.jpg")
template = cv2.imread("image/20.jpg")
h, w, c = template.shape
# 1)匹配模板,得到匹配灰度图
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED) # 最大值为最匹配区域
# 2)当匹配像素值>=0.95时,我们认为是匹配的
locs = numpy.where(res >= 0.95) # numpy.where(条件) 返回满足条件的下标
for pt in zip(*locs[::-1]):
# 3)最后,将所有匹配的区域标记出来
cv2.rectangle(img, (pt[0], pt[1]), (pt[0] + w, pt[1] + h), color=(0, 0, 255), thickness=1)
cv2.imshow("img", img)
cv2.imshow("template", template)
cv2.waitKey(0)
cv2.destroyWindow()

网友评论