赞
踩
什么是模板匹配呢?
看到这里大家是否会觉得很熟悉的感觉涌上心头!在人脸识别是不是也会看见 等等。
模板匹配可以看作是对象检测的一种非常基本的形式。使用模板匹配,我们可以使用包含要检测对象的“模板”来检测输入图像中的对象。
参数:(img: 原始图像、temple: 模板图像、method: 匹配度计算方法)
方法如下:
cv2.TM_SQDIFF: 计算平方差,计算结果越小,越相关
公式:
cv2.TM_CCORR: 计算相关性,计算出来的值越大,越相关
公式:
cv2.TM_CCOEFF: 计算相关系数,计算出的值越大,越相关
公式:
cv2.TM_SQDIFF_NORMED: 计算归一化平方差,计算结果越接近0,越相关
公式:
cv2.TM_CCORR_NORMED: 计算归一化相关性,计算结果越接近1,越相关
公式:
cv2.TM_CCOEFF_NORMED: 计算归一化相关系数,计算结果越接近1,越相关
公式:
img代表原始图像,template代表模板窗口,1默认为cv2.TM_SQDIFF方法
res = cv2.matchTemplate(img, template, 1)
获取结果的最值和最值位置(最值位置是左上角的坐标位置,通过模板的宽和高可以在原图上把模板位置画出来)
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)
完整的代码:
- import cv2
- import numpy as np
- import matplotlib.pyplot as plt
- def cv_show(name,img):
- cv2.imshow(name,img)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
- img=cv2.imread('C:/Users/bwy/Desktop/7.png',0)
- template=cv2.imread('C:/Users/bwy/Desktop/8.png',0)
- methods=['cv2.TM_CCOEFF','cv2.TM_CCOEFF_NORMED','cv2.TM_CCORR','cv2.TM_CCORR_NORMED'
- ,'cv2.TM_SQDIFF','cv2.TM_SQDIFF_NORMED']
- for meth in methods:
- img3=img.copy()
- method=eval(meth)
- print(meth)
- res1=cv2.matchTemplate(img,template,method)
- min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res1)
- if method in [cv2.TM_SQDIFF,cv2.TM_SQDIFF_NORMED]:
- top_left=min_loc
- else:
- top_left=max_loc
- bottom_right=(top_left[0]+w,top_left[1]+h)
- #俩矩形
- cv2.rectangle(img3,top_left,bottom_right,255,2)
- plt.subplot(121),plt.imshow(res1,cmap='gray')
- plt.xticks([]),plt.yticks([])#隐藏坐标轴
- plt.subplot(122),plt.imshow(img3,cmap='gray')
- plt.xticks([]),plt.yticks([])#隐藏坐标轴
- plt.suptitle(meth)
- plt.show()
结果如图所示:
多次实验你会发现归一的方法更准确。
1.导包构建函数
- import cv2
- import numpy as np
- import matplotlib.pyplot as plt
- def cv_show(name,img):
- cv2.imshow(name,img)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
2.读入图像转灰度图,改大小。
- im=cv2.imread('C:/Users/bwy/Desktop/9.png')
- TE=cv2.imread('C:/Users/bwy/Desktop/10.png',cv2.IMREAD_GRAYSCALE)
- im1=cv2.resize(im,(600,337))
- cv_show('im',im1)
- img_=cv2.cvtColor(im1,cv2.COLOR_BGR2GRAY)
- TE=cv2.resize(TE,(60,60))
- TE.shape
3.图像匹配
- h,w=TE.shape[:2]
- r=cv2.matchTemplate(img_,TE,cv2.TM_CCOEFF_NORMED)
- cv_show('r',r)
结果如图所示:
4.取匹配程度大于75%的坐标 ,画在原图上
其中:zip(*) 可理解为解压,返回二维矩阵式。loc中loc[0]是高,loc[1]是宽,[::-1]表示倒序。p[0]代表宽,p[1]代表高
- threshold=0.75
- loc=np.where(r>=threshold)
- for pt in zip(*loc[::-1]):#*代表可选参数
- bottom_right=(pt[0]+w,pt[1]+h)
- cv2.rectangle(im1,pt,bottom_right,(0,0,255),1)
- cv_show('im1',im1)
结果如图所示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。