赞
踩
模板匹配的原理,是根据平方差或相似系数表示图片的差异。
我们不妨先读进两张图片,其中一张是另一张的一部分截取而成。
- 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)
其余六种方法,只需要对上述代码进行相应的更改就可以进行运转了。
模板匹配就给大家介绍到这里了,大家下篇文章见。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。