• 常用于对象检测
  • 匹配方法为:
  1. 模板在原始图像中滑动
  2. 使用归一化相关系数匹配的方法,将模板与图像的所有重叠部分进行比较
  3. 最终得到结果在0-1的范围之间 

实践测试中,使用如下为输入图片,左图为测试图片,右图为目标图片:

                   

          测试图片                 目标图片

 

实践过程:

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

 

归一化相关系数匹配算法:

 

 

 测试代码:

 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

 

posted on 2023-07-28 14:31  Jolyne123  阅读(212)  评论(0)    收藏  举报