模板匹配的原理,是根据平方差或相似系数表示图片的差异。
我们不妨先读进两张图片,其中一张是另一张的一部分截取而成。
img=cv2.imread('E:\Anaconda\Anaconda3.8\QR.jpg',0)
template=cv2.imread('E:\Anaconda\Anaconda3.8\QR_cut.jpg',0)
h,w=template.shape[:2]接下来,分别读取一下两张图片的shape

下面需要用到六种不同的模板匹配公式,这里先向大家介绍一下:
TM_SQDIFF 平方差 越小越好
TM_CCORR 相关性 越大越好
TM_CCOOEFF 相关系数 越大越好
TM_SQDIFF_NORMED
TM_CCORR_NORMED
TM_CCOEFF_NORMED
带有NORMED的是进行归一化操作
方法选择时最好选择带有归一化操作的
我们以选取第一种为例来进行代码编写
#规定使用的方法
methods = ['cv2.TM_CCOEFF']
#进行模板匹配
res = cv2.matchTemplate(img,template,1)
#输出模板匹配的结果范围
res.shape
#定义最小值,最大值,最小值取值位置,最大值取值位置
min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(res)
#引用所使用的方法
methods = ['cv2.TM_CCOEFF_NORMED']
for meth in methods:
img2=img.copy()
#eval函数就是实现list、dict、tuple与str之间的转化
method=eval(meth)
#打印所使用的方法
print(method)
#进行模板匹配
res = cv2.matchTemplate(img,template,method)
#定位
min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(res)
#如果是平方差匹配或归一平方差匹配
if method in[cv2.TM_CCOEFF_NORMED] :
top_left = max_loc
# else:
# top_left = max_loc
bottom_right=(top_left[0]+w,top_left[1]+h)
#画矩形
cv2.rectangle(img2,top_left,bottom_right,0,6)
plt.subplot(121),plt.imshow(res,cmap='gray')
plt.xticks([]),plt.yticks([])#隐藏坐标轴
plt.subplot(122),plt.imshow(img2,cmap='gray')
plt.xticks([]),plt.yticks([])#隐藏坐标轴
#矩形标题
plt.suptitle(meth)
plt.show()
cv2.imshow('Little-kiss',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('E:\Anaconda\Anaconda3.8\Block1.jpg',img2)其余六种方法,只需要对上述代码进行相应的更改就可以进行运转了。
模板匹配就给大家介绍到这里了,大家下篇文章见。
版权声明:本文为m0_54396639原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。