本文使用python实现。python
OpenCV中模板匹配使用的公式以下算法
函数(1):平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。 函数(2):归一化平方差匹配法 函数(3):相关匹配法:该方法采用乘法操做;数值越大代表匹配程度越好。 函数(4):归一化相关匹配法 函数(5):相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。 函数(6):归一化相关系数匹配法
代码以下函数
import cv2 as cv import numpy as np def template_demo(): tpl = cv.imread("C:/Users/admin/Desktop/sample.jpg") target = cv.imread("C:/Users/admin/Desktop/bird.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: print(md) result = cv.matchTemplate(target, tpl, md) ''' def matchTemplate(image: Any, # 待匹配的源图像 templ: Any, # 模板图像 method: Any, # 模板匹配算法 result: Any = None, # 保存结果,咱们能够经过minMaxLoc()肯定结果矩阵的最大值和最小值的位置. mask: Any = None) -> None 关于模板匹配算法,有如下6种: enum { TM_SQDIFF=0, # 平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。 TM_SQDIFF_NORMED=1, # 归一化平方差匹配法 TM_CCORR=2, # 相关匹配法:该方法采用乘法操做;数值越大代表匹配程度越好。 TM_CCORR_NORMED=3, # 归一化相关匹配法 TM_CCOEFF=4, # 相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。 TM_CCOEFF_NORMED=5 }; # 归一化相关系数匹配法 TM_SQDIFF,TM_SQDIFF_NORMED匹配数值越低表示匹配效果越好,其它四种反之。 TM_SQDIFF_NORMED,TM_CCORR_NORMED,TM_CCOEFF_NORMED是标准化的匹配,获得的最大值,最小值范围在0~1之间,其它则须要本身对结果矩阵归一化。 不一样的方法会获得差别很大的结果,能够经过测试选择最合适的方法。 ''' min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result) ''' def minMaxLoc(src: Any, mask: Any = None) -> None 函数功能:假设有一个矩阵a,如今须要求这个矩阵的最小值,最大值,并获得最大值,最小值的索引。 使用这个cv2.minMaxLoc()函数就可所有解决。函数返回的四个值就是上述所要获得的。 ''' if md == cv.TM_SQDIFF_NORMED: tl = min_loc else: tl = max_loc br = (tl[0]+tw, tl[1]+th) cv.rectangle(target, tl, br, (0, 0, 255), 2) # 在图上绘制矩形 ''' def rectangle(img: Any, # 图像 pt1: Any, # 矩形的一个顶点 pt2: Any, # 矩形对角线上的另外一个顶点 color: Any, # 矩形线条颜色(RGB)或亮度(灰度图像),(0, 0, 255)表示红色 thickness: Any = None, # 组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。 lineType: Any = None, # 线条的类型 shift: Any = None) -> None # 坐标点的小数点位数。 ''' cv.imshow("match-"+np.str(md), target) template_demo() cv.waitKey(0) cv.destroyAllWindows()
使用cv.TM_SQDIFF_NORMED计算出的结果:测试
使用cv.TM_CCORR_NORMED计算出的结果code
使用cv.TM_CCOEFF_NORMED计算出的结果blog
这三种方式均可以获得正确结果。索引