Opencv第十三章 进阶篇之模板匹配

模板匹配的原理,是根据平方差或相似系数表示图片的差异。

我们不妨先读进两张图片,其中一张是另一张的一部分截取而成。

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版权协议,转载请附上原文出处链接和本声明。