- 常用于对象检测
- 匹配方法为:
- 模板在原始图像中滑动
- 使用归一化相关系数匹配的方法,将模板与图像的所有重叠部分进行比较
- 最终得到结果在0-1的范围之间
实践测试中,使用如下为输入图片,左图为测试图片,右图为目标图片:

测试图片 目标图片
实践过程:
- 使用归一化相关系数匹配方法,计算出原始图像和模板图像的归一化相关系数,得出的值越接近1,越相关
- 使用函数找到结果中的最大值的位置
- 根据模板图像的长宽,定位目标在原始图像中的位置
- 计算出目标中心(也就是点击坐标)
归一化相关系数匹配算法:


测试代码:
1 import cv2 as cv 2 import numpy as np 3 import matplotlib.pyplot as plt 4 5 6 def rescale_image(img,opt,times): 7 if opt == "up": 8 scale_up_x = int(times) 9 scale_up_y = int(times) 10 return cv.resize(img, None, fx= scale_up_x, fy= scale_up_y, interpolation= cv.INTER_LINEAR) 11 if opt == "down": 12 scale_down = int(times) 13 return cv.resize(img, None, fx= scale_down, fy= scale_down, interpolation= cv.INTER_LINEAR) 14 15 if __name__ == '__main__': 16 original = cv.imread('orb1.png') 17 img = cv.imread('orb1.png', 0) 18 template = cv.imread('orb2.png', 0) 19 template = rescale_image(template, opt="up", times=5) 20 21 h, w = template.shape[:2] 22 23 point_size = 1 24 point_color = (0, 0, 255) # BGR 25 thickness = 10 26 27 # TM_CCOEFF_NORMED---归一化相关系数匹配;TM_CCOEFF---相关匹配;TM_SQDIFF_NORMED---归一化平方差匹配; 28 # TM_SQDIFF---平方差匹配;TM_CCORR---相关匹配;TM_CCORR_NORMED---归一化相关匹配 29 # method 的值为 cv2.TM_SQDIFF 和 cv2.TM_SQDIFF_NORMED 时,result 值为 0 表示匹配度最好,值越大,表示匹配度越差。 30 # method 的值为 cv2.TM_CCORR、cv2.TM_CCORR_NORMED、cv2.TM_CCOEFF 和 cv2.TM_CCOEFF_NORMED 时,result 的值越小表示匹配度越差,值越大表示匹配度越好。 31 methods = ['cv.TM_CCOEFF_NORMED', 'cv.TM_CCOEFF', 'cv.TM_SQDIFF_NORMED', 'cv.TM_SQDIFF', 32 'cv.TM_CCORR', 'cv.TM_CCORR_NORMED'] 33 34 ret_img = cv.matchTemplate(img, template, cv.TM_CCOEFF_NORMED) 35 # 函数cv2.minMaxLoc()来查找函数 cv2.matchTemplate()返回值中的最值位置,就可以找到最佳模板匹配的位置 36 min_val, max_val, min_loc, max_loc = cv.minMaxLoc(ret_img) 37 38 draw_img = original.copy() 39 # cv2.rectangle(img, (x, y), (x+w, y+h), color, thickness) 40 ret_img = cv.rectangle(draw_img, (max_loc[0], max_loc[1]), (max_loc[0]+w, max_loc[1]+h), point_color, thickness) 41 ret_center = (int((2 * max_loc[0] + w) / 2), int((2 * max_loc[1] + h) / 2)) 42 cv.circle(draw_img, ret_center, point_size, point_color, thickness) 43 44 45 cv.imshow('pattern match', ret_img) 46 cv.waitKey(0) 47 cv.destroyAllWindows()
其中
ret_center = (int((2 * max_loc[0] + w) / 2), int((2 * max_loc[1] + h) / 2))
cv.circle(draw_img, ret_center, point_size, point_color, thickness)
实践结果:得到中心点坐标(放大可见)

opencv-python中对于模板匹配的其他算法资料(代码27-32):
- https://i.cnblogs.com/articles/edit;postId=17585210
实践参考博客:
- https://blog.csdn.net/Ggs5s_/article/details/130338347
可能会用到的参考博客:
- https://blog.csdn.net/weixin_44259720/article/details/127251331
- https://www.cnblogs.com/my-love-is-python/p/10403203.html
- https://blog.51cto.com/u_12227/6612862
- https://blog.csdn.net/qq_45832961/category_11556929.html?spm=1001.2014.3001.5482
openCV-python画图参考:
- https://www.yii666.com/blog/441056.html
浙公网安备 33010602011771号