背景简介
模板匹配通常被用于目标检测、相似度分析中,opencv2和opencv3中提供了一个专门用于模板匹配的函数matchTemplate(),下面就对该函数以及其它设计的函数进行详细的介绍
函数说明
1、matchTemplate(image,template,method)
参数说明:
image :源图,待搜索图像 template:模版图像,需要搜索的图像 method:计算匹配程度的方法,具体method方法有如下:
1 2 3 4 5 6 | CV_TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大
CV_TM_CCORR 相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好
CV_TM_CCOEFF 相关系数匹配法:1表示完美的匹配;-1表示最差的匹配
CV_TM_SQDIFF_NORMED 归一化平方差匹配法
CV_TM_CCORR_NORMED 归一化相关匹配法
CV_TM_CCOEFF_NORMED 归一化相关系数匹配法
|
最后,可cvMinMaxLoc() 函数获取最后的最佳匹配结果
2、minMaxLoc(res)
minMaxLoc寻找矩阵(一维数组当作向量,用Mat定义) 中最小值和最大值的位置 注意:多通道图像在使用minMaxLoc()函数是不能给出其最大最小值坐标的,因为每个像素点其实有多个坐标,所以是不会给出的。因此在编程时,这2个位置应该给NULL。
res 为 上面函数 matchTemplate 所匹配到的结果为参数
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)
我们定义一下变量用于接收minMaxLoc获取匹配的图像的匹配值和坐标
min_val:最小匹配值 max_val:最大匹配值 min_loc:最小坐标 max_loc:最大坐标
举个例子
找出模版图片在原图中的为之并标注
源图片 
模版图片 
实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | import cv2
imgsr = cv2.imread( "/Users/laoyan/Desktop/sourcetest.png" )
imgtm = cv2.imread( "/Users/laoyan/Desktop/templatewatchtest.png" )
#获取模板图片的高和宽
imgtmh1 = imgtm.shape[ 0 ]
imgtmw1 = imgtm.shape[ 1 ]
#与模版比对
res = cv2.matchTemplate(imgsr,imgtm,cv2.TM_CCOEFF_NORMED)
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)
img = cv2.rectangle(imgsr,max_loc,(max_loc[ 0 ] + imgtmw1,max_loc[ 1 ] + imgtmh1),( 0 , 0 , 255 ), 2 )
cv2.imshow( 'Image' ,img)
cv2.waitKey( 0 )
cv2.destroyAllWindows()
|
结果如下: 
|