OpenCV-Python:模板匹配
啥叫模板匹配
模板匹配就是在大图中找小图,也就说在一幅图像中寻找另一幅模板图像的位置:
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:模板匹配相关推荐
- OpenCV—python 模板匹配与图像特征匹配
文章目录 一.理论介绍与算法 二.算法代码 单目标匹配 多目标匹配 三 多尺度模板匹配 一.理论介绍与算法 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个 ...
- Python+OpenCV:模板匹配(Template Matching)
Python+OpenCV:模板匹配(Template Matching) Template Matching with Single Objects ######################## ...
- Opencv java模板匹配-角点检测(11)
函数 在opencv中有模板匹配的方法, Imgproc.matchTemplate(src, template, result, Imgproc.TM_CCOEFF); 这个方法输入的参数分别是: ...
- python 模板匹配
TM_CCOEFF_NORMED可以用分数过滤,0.7效果还行. 不需要匹配的地方,可以用黑色填充,不能用白色填充,结果仍然返回矩形框. 注释的代码现在不能用分数过滤,会有误检 TM_SQDIFF_N ...
- 基于VS与OpenCV的模板匹配学习(4):手写OpenCV matchTemplate()
基于VS与OpenCV的模板匹配学习(4):手写OpenCV matchTemplate() 文章目录 基于VS与OpenCV的模板匹配学习(4):手写OpenCV matchTemplate() 前 ...
- OpenCV:模板匹配
小程序「跳一跳」的自动化. 主要涉及到了OpenCV的模板匹配和边缘检测技术,以及Android开发调试工具ADB. 如果放在一起说,感觉内容有些多. 所以,分三期来讲,也能多了解一些东西. 首先介绍 ...
- Python+Opencv实现模板匹配
目录 一.模板匹配简介 二.传统模板匹配算法不足之处 三.多尺度模板匹配实现步骤 四.多尺度模板匹配实现代码 五.多尺度模板匹配效果展示和分析 六.思维扩展 参考资料 注意事项 一.模板匹配简介 ...
- python 模板匹配原理与实战
1. 简述 为了让大家不至于看到后面的公式就退却,我先简单描述一下模板匹配的原理: 简单来说,模板匹配就是你拿一个模板(图片)在目标图片上依次滑动,每次计算模板与模板下方的子图的相似度,最后我们就计算 ...
- python 模板匹配多个物体
参考: https://www.jianshu.com/p/c20adfa72733 平方差匹配CV_TM_SQDIFF:用两者的平方差来匹配,最好的匹配值为0 归一化平方差匹配CV_TM_SQDIF ...
- 基于opencv的模板匹配详解
1.什么是模板匹配 在OpenCV教程中这样解释模板匹配: 模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术.这里说的模板是我们已知的小图像,模板匹配就是在一副大图像中搜寻目标. ...
最新文章
- CVPR2021单目深度估计:腾讯光影研究室优势夺冠,成果落地应用
- java命令行编译时提示找不到或无法加载主类的问题
- Eureka服务器端启动时报错:Connection refused :connect
- 对称振子天线matlab程序,对称振子天线详解.ppt
- iOS 友盟统计的bug分析
- java端到端_Java应用程序性能监控:复杂分布式应用程序的端到端性能
- PID控制器开发笔记之五:变积分PID控制器的实现
- Redis高可用架构 (redis主从+sentinel)
- POJ3163 King of Fighters 状压DP/费用流
- OpenCV Kmeans
- redis原子性读写操作之LUA脚本和watch机制
- linux NTP服务
- 创建运行时类的对象--Class.newInstance()
- 免费ebook 好东东!一起分享
- 【Java从零到架构师第③季】【30】SpringMVC-转发_重定向_路径问题总结
- 读书虽苦,却是最容易的那条!
- AUTOCAD——圆环
- 销售宝:用财务软件做账要注意什么?
- 30天,O2O速成攻略【7.18广州站】
- 前端接入阿里云外呼SDK