模板匹配matchTemplate

打印 上一主题 下一主题

主题 574|帖子 574|积分 1722

定义:模板匹配是在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和图片,整个使命的思路就是按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最终将匹配度最高的区域选择为最终的结果。
原理:将模板块每次移动一个像素(从左往右,从上往下),在每一个位置,都计算与模板图像的相似水平。对于每一个位置将计算的相似结果生存在结果矩阵®中。如果输入图像的大小(WxH)且模板图像的大小(wxh),则输出矩阵R的大小为(W-w +1,H-h+1)将R表现为图像。得到图像后,查找最大值地点的位置,那么该位置对应的区域就被认为是最匹配的。对应的区域就是以该点为顶点,长宽和模板图像一样大小的矩阵。
案例
API
  1. res = cv.matchTemplate(img,template,method)
  2. img:要进行模板匹配的图像
  3. Template:模板
  4. 实现模板匹配的算法,主要有method:
  5. 1.平方差匹配(cv2.TM_SQDIFF_NORMED):利用模板与图像之间的平方差进行匹配最好的匹配是0,匹配越差,匹配的值越大。
  6. 2.相关匹配(cv2.TM_CCORR_NORMED):利用模板与图像间的乘法进行匹配,数值越大表示匹配程度较高,越小表示匹配效果差,
  7. 3.利用相关系数匹配(cv2.TM_CCOEFF_NORMED):利用模板与图像间的相关系数匹配,1表示完美的匹配,-1表示最差的匹配。
复制代码
完成匹配后,使用cv.minMaxLoc()方法查找最大值地点的位置即可。如果使用平方差作为比力方法,则最小值位置是最佳匹配位置。
单个对象匹配
  1. import cv2 as cv2
  2. img = cv2.imread('11.png')    #(781, 1314, 3)数组
  3. template = cv2.imread('kg.png') #(109, 110, 3)
  4. h, w = template.shape[:2]  ##参照物体宽高
  5. # 匹配模板
  6. res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED) #(673, 1205)
  7. min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
  8. # 计算矩形左边
  9. top_left = max_loc
  10. bottom_right = (top_left[0] + w, top_left[1] + h)
  11. # 画矩形
  12. cv2.rectangle(img, top_left, bottom_right, (0, 255, 0), 5)
  13. #cv.rectangle(img,leftupper,rightdown,color,thickness)
  14. #img:要绘制矩形的图像
  15. #Leftupper, rightdown:矩形的左上角和右下角坐标
  16. #color: 线条的颜色
  17. #Thickness: 线条宽度
  18. # 展示结果
  19. cv2.imshow('img_rgb', img)
  20. cv2.waitKey(0)
复制代码
多个对象匹配
  1. import cv2
  2. import numpy as np
  3. # 读取目标图像和模板图像
  4. img = cv2.imread('11.png')
  5. template = cv2.imread('tp.png')
  6. # 获取模板图像的宽度和高度
  7. h, w = template.shape[:2]
  8. # 模板匹配
  9. res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
  10. # 设置匹配的阈值,通常在0.8~1.0之间
  11. threshold = 0.75  
  12. loc = np.where(res >= threshold)
  13. # 绘制匹配的矩形框并统计匹配数量
  14. count = 0
  15. for pt in zip(*loc[::-1]):  # 将匹配结果的坐标反转,以便用于cv2.rectangle
  16.     cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)
  17.     count += 1
  18. # 显示结果
  19. cv2.putText(img, f"Found {count} objects", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
  20. #cv.putText(img,text,station, font, fontsize,color,thickness,cv.LINE_AA)
  21. #img: 图像
  22. #text:要写入的文本数据
  23. #station:文本的放置位置
  24. #font:字体
  25. #Fontsize :字体大小
  26. #cv.LINE_AA:避免图像线段锯齿型
  27. cv2.imshow('Detected', img)
  28. cv2.waitKey(0)
  29. cv2.destroyAllWindows()
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表