赞
踩
一、什么是模版匹配?
二、模版匹配实现原理(了解即可):
三、OpenCV实现:
1、基本模版匹配实现:
result = cv2.matchTemplate(image, templ, method, result=None, mask=None)
method | 描述 |
---|---|
CV_TM_SQDIFF | 平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。 |
CV_TM_SQDIFF_NORMED | 相关匹配法:该方法采用乘法操作.。完全匹配会得到很大值,不匹配会得到一个很小值或0。 |
CV_TM_CCORR | 相关系数匹配法:1表示完美的匹配;-1表示最差的匹配,该方法使用源图像与模板图像的卷积结果进行匹配,因此,最佳匹配位置在值最大处,值越小匹配结果越差。 |
CV_TM_CCORR_NORMED | 归一化平方差匹配法 |
CV_TM_CCOEFF | 归一化相关匹配法,与相关性匹配方法类似,最佳匹配位置也是在值最大处。 |
CV_TM_CCOEFF_NORMED | 归一化相关系数匹配法 , 该方法使用源图像与其均值的差、模板与其均值的差二者之间的相关性进行匹配,最佳匹配结果在值等于1处,最差匹配结果在值等于-1处,值等于0直接表示二者不相关。 |
数学原理(了解即可):
查找最大最小值:
min_val,max_val,min_indx,max_indx = cv2.minMaxLoc(src, mask=None)
参数:
返回值:
在给定的矩阵中寻找最大和最小值,并给出它们的位置。 该功能不适用于多通道阵列。 如果您需要在所有通道中查找最小或最大元素,要先将阵列重新解释为单通道。
import cv2 as cv def template_demo(): tpl = cv.imread("a.jpg") #匹配的模版 target = cv.imread("first.jpg") #原图像 cv.imshow("template image",tpl) cv.imshow("target image",target) methods = [cv.TM_SQDIFF_NORMED,cv.TM_CCORR_NORMED,cv.TM_CCOEFF_NORMED]#各种匹配算法 th,tw = tpl.shape[:2]#获取模板图像的高宽 for md in methods: result = cv.matchTemplate(target,tpl,md) # result是我们各种算法下匹配后的图像 #获取的是每种公式中计算出来的值,每个像素点都对应一个值 min_val,max_val,min_loc,max_loc = cv.minMaxLoc(result) if md == cv.TM_SQDIFF_NORMED: #相关匹配法的左上角是最小值 tl = min_loc #tl是左上角点 else: tl = max_loc br = (tl[0]+tw,tl[1]+th) #右下点 cv.rectangle(target,tl,br,(0,0,255),2)#画矩形 cv.imshow("match-%s"%md,target) if __name__ == "__main__": template_demo() cv.waitKey(0) #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作 cv.destroyAllWindows() #销毁所有窗口
练习题 11:
利用模版匹配,截取一本书的封面(最好是颜色鲜艳的),使用摄像头找到书本,并播放视频并显示框选框。(可以尝试在匹配前进行优化)
评论出你的答案。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。