啥叫模板匹配

模板匹配就是在大图中找小图,也就说在一幅图像中寻找另一幅模板图像的位置:

OpenCV使用 cv2.matchTemplate() 实现模板匹配。

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('lena.jpg', 0)
template = cv2.imread('face.jpg', 0)
h, w = template.shape[:2]    # rows->h, cols->w

匹配函数返回的是一幅灰度图,最白的地方表示最大的匹配。使用 cv2.minMaxLoc() 函数可以得到最大匹配值的坐标,以这个点为左上角角点,模板的宽和高画矩形就是匹配的位置了:

# 相关系数匹配方法: cv2.TM_CCOEFF
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)left_top = max_loc   # 左上角
right_bottom = (left_top[0] + w, left_top[1] + h)   # 右下角
cv2.rectangle(img, left_top, right_bottom, 255, 2)  # 画出矩形位置

plt.subplot(121), plt.imshow(res, cmap='gray')
plt.title('Matching Result'), plt.xticks([]), plt.yticks([])plt.subplot(122), plt.imshow(img, cmap='gray')
plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
plt.show()

模板匹配的原理

模板匹配的原理其实很简单,就是不断地在原图中移动模板图像去比较,有6种不同的比较方法,详细请参考:TemplateMatchModes

  • 平方差匹配 CV_TM_SQDIFF:用两者的平方差来匹配
  • 归一化平方差匹配 CV_TM_SQDIFF_NORMED
  • 相关匹配 CV_TM_CCORR:用两者的乘积匹配,数值越大表明匹配程度越好
  • 归一化相关匹配 CV_TM_CCORR_NORMED
  • 相关系数匹配 CV_TM_CCOEFF:用两者的相关系数匹配,1表示完美匹配,-1表示最差匹配
  • 归一化相关系数匹配 CV_TM_CCOEFF_NORMED

归一化的意思就是将值统一到0~1,这六种方法的对比详情请见 Template Matching. 模板匹配也是应用卷积来实现的:假设原图大小为 WxH,模板图大小为 w×h,那么生成图大小是(W-w+1)x(H-h+1),生成图中的每个像素值表示原图与模板的匹配程度

匹配多个物体

前面我们是找最大匹配的点,所以只能匹配一次。我们可以设定一个匹配阈值来匹配多次:

# 1. 读入原图和模板
img_rgb = cv2.imread('mario.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('mario_coin.jpg', 0)
h, w = template.shape[:2]# 归一化平方差匹配
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8# 这段代码后面会有解释
loc = np.where(res >= threshold)  # 匹配程度大于80%的坐标y,x
for pt in zip(*loc[::-1]): # *号表示可选参数right_bottom = (pt[0] + w, pt[1] + h)cv2.rectangle(img_rgb, pt, right_bottom, (0, 0, 255), 2)cv2.imwrite('res.png', img_rgb)

这里解释一下第三段的代码:

1. np.where() 在这里返回res中值大于0.8的所有坐标,如:

x = np.arange(9.).reshape(3, 3)
print(np.where(x > 5))

(array([2, 2, 2], dtype=int64), array([0, 1, 2], dtype=int64))结果的含义是(先y坐标,在x坐标)

2. zip() 函数

x = [1, 2, 3]
y = [4, 5, 6]
print(list(zip(x, y)))

[(1, 4), (2, 5), (3, 6)]

这样的解释的话,第三段代码就好理解了:因为loc是先y坐标再x坐标,所以用loc[::-1]翻转一下,然后再用zip函数拼接一下。

思考一下:

图片旋转或缩放的话,模板匹配还有作用吗?

答案是没有作用,因为只有平移的动作,并没有考虑到其他图像特征。这也是模板匹配的局限性所在,但可以使用改进的模板匹配算法。

参考百科链接:https://baike.baidu.com/item/模板匹配


转载于:https://www.cnblogs.com/gezhuangzhuang/p/10724769.html

OpenCV-Python:模板匹配相关推荐

  1. OpenCV—python 模板匹配与图像特征匹配

    文章目录 一.理论介绍与算法 二.算法代码 单目标匹配 多目标匹配 三 多尺度模板匹配 一.理论介绍与算法 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个 ...

  2. Python+OpenCV:模板匹配(Template Matching)

    Python+OpenCV:模板匹配(Template Matching) Template Matching with Single Objects ######################## ...

  3. Opencv java模板匹配-角点检测(11)

    函数 在opencv中有模板匹配的方法, Imgproc.matchTemplate(src, template, result, Imgproc.TM_CCOEFF); 这个方法输入的参数分别是: ...

  4. python 模板匹配

    TM_CCOEFF_NORMED可以用分数过滤,0.7效果还行. 不需要匹配的地方,可以用黑色填充,不能用白色填充,结果仍然返回矩形框. 注释的代码现在不能用分数过滤,会有误检 TM_SQDIFF_N ...

  5. 基于VS与OpenCV的模板匹配学习(4):手写OpenCV matchTemplate()

    基于VS与OpenCV的模板匹配学习(4):手写OpenCV matchTemplate() 文章目录 基于VS与OpenCV的模板匹配学习(4):手写OpenCV matchTemplate() 前 ...

  6. OpenCV:模板匹配

    小程序「跳一跳」的自动化. 主要涉及到了OpenCV的模板匹配和边缘检测技术,以及Android开发调试工具ADB. 如果放在一起说,感觉内容有些多. 所以,分三期来讲,也能多了解一些东西. 首先介绍 ...

  7. Python+Opencv实现模板匹配

    目录 一.模板匹配简介 二.传统模板匹配算法不足之处 三.多尺度模板匹配实现步骤 四.多尺度模板匹配实现代码 五.多尺度模板匹配效果展示和分析 六.思维扩展 参考资料 注意事项 一.模板匹配简介    ...

  8. python 模板匹配原理与实战

    1. 简述 为了让大家不至于看到后面的公式就退却,我先简单描述一下模板匹配的原理: 简单来说,模板匹配就是你拿一个模板(图片)在目标图片上依次滑动,每次计算模板与模板下方的子图的相似度,最后我们就计算 ...

  9. python 模板匹配多个物体

    参考: https://www.jianshu.com/p/c20adfa72733 平方差匹配CV_TM_SQDIFF:用两者的平方差来匹配,最好的匹配值为0 归一化平方差匹配CV_TM_SQDIF ...

  10. 基于opencv的模板匹配详解

    1.什么是模板匹配 在OpenCV教程中这样解释模板匹配: 模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术.这里说的模板是我们已知的小图像,模板匹配就是在一副大图像中搜寻目标. ...

最新文章

  1. CVPR2021单目深度估计:腾讯光影研究室优势夺冠,成果落地应用
  2. java命令行编译时提示找不到或无法加载主类的问题
  3. Eureka服务器端启动时报错:Connection refused :connect
  4. 对称振子天线matlab程序,对称振子天线详解.ppt
  5. iOS 友盟统计的bug分析
  6. java端到端_Java应用程序性能监控:复杂分布式应用程序的端到端性能
  7. PID控制器开发笔记之五:变积分PID控制器的实现
  8. Redis高可用架构 (redis主从+sentinel)
  9. POJ3163 King of Fighters 状压DP/费用流
  10. OpenCV Kmeans
  11. redis原子性读写操作之LUA脚本和watch机制
  12. linux NTP服务
  13. 创建运行时类的对象--Class.newInstance()
  14. 免费ebook 好东东!一起分享
  15. 【Java从零到架构师第③季】【30】SpringMVC-转发_重定向_路径问题总结
  16. 读书虽苦,却是最容易的那条!
  17. AUTOCAD——圆环
  18. 销售宝:用财务软件做账要注意什么?
  19. 30天,O2O速成攻略【7.18广州站】
  20. 前端接入阿里云外呼SDK

热门文章

  1. Junit单元测试时提示:Method should have no parameters
  2. SSM进出帐账单正负显示
  3. 连续写博客2个月之后,我感觉自己的心态有了一些变化
  4. 谈谈java的并发容器、Queue
  5. C++中引用的一些问题
  6. 618 兵临城下,你需要一个更省钱省力的数据根基平台!
  7. 企业找到最佳增长点的 4 个关键因素
  8. 喜报!爱卡汽车签约神策数据
  9. SparkSQL的3种Join实现
  10. 在Android手机上配置office 365邮箱