OpenCV系列之模板匹配 | 三十一
目标
在本章中,您将学习
使用模板匹配在图像中查找对象
你将看到以下功能:cv.matchTemplate(),cv.minMaxLoc()
理论
模板匹配是一种用于在较大图像中搜索和查找模板图像位置的方法。为此,OpenCV带有一个函数cv.matchTemplate()。
它只是将模板图像滑动到输入图像上(就像在2D卷积中一样),然后在模板图像下比较模板和输入图像的拼图。
OpenCV中实现了几种比较方法。(您可以检查文档以了解更多详细信息)。它返回一个灰度图像,其中每个像素表示该像素的邻域与模板匹配的程度。
如果输入图像的大小为(WxH)
,而模板图像的大小为(wxh)
,则输出图像的大小将为(W-w + 1,H-h + 1)
。得到结果后,可以使用cv.minMaxLoc()函数查找最大/最小值在哪。将其作为矩形的左上角,并以(w,h)
作为矩形的宽度和高度。该矩形是您模板的区域。
注意
如果使用cv.TM_SQDIFF作为比较方法,则最小值提供最佳匹配。
OpenCV中的模板匹配
作为示例,我们将在梅西的照片中搜索他的脸。所以我创建了一个模板,如下所示:
我们将尝试所有比较方法,以便我们可以看到它们的结果如何:
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',0)
img2 = img.copy()
template = cv.imread('template.jpg',0)
w, h = template.shape[::-1]
# 列表中所有的6种比较方法
methods = ['cv.TM_CCOEFF', 'cv.TM_CCOEFF_NORMED', 'cv.TM_CCORR','cv.TM_CCORR_NORMED', 'cv.TM_SQDIFF', 'cv.TM_SQDIFF_NORMED']
for meth in methods:img = img2.copy()method = eval(meth)# 应用模板匹配res = cv.matchTemplate(img,template,method)min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)# 如果方法是TM_SQDIFF或TM_SQDIFF_NORMED,则取最小值if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:top_left = min_locelse:top_left = max_locbottom_right = (top_left[0] + w, top_left[1] + h)cv.rectangle(img,top_left, bottom_right, 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.suptitle(meth)plt.show()
查看以下结果:
cv.TM_CCOEFF
cv.TM_CCOEFF_NORMED
cv.TM_CCORR
cv.TM_CCORR_NORMED
cv.TM_SQDIFF
cv.TM_SQDIFF_NORMED
您会看到,使用cv.TM_CCORR的结果并不理想。
多对象的模板匹配
在上一节中,我们在图像中搜索了梅西的脸,该脸在图像中仅出现一次。假设您正在搜索具有多次出现的对象,则cv.minMaxLoc()不会为您提供所有位置。在这种情况下,我们将使用阈值化。因此,在此示例中,我们将使用著名游戏Mario的屏幕截图,并在其中找到硬币。
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img_rgb = cv.imread('mario.png')
img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
template = cv.imread('mario_coin.png',0)
w, h = template.shape[::-1]
res = cv.matchTemplate(img_gray,template,cv.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):cv.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
cv.imwrite('res.png',img_rgb)
结果:
☆☆☆为方便大家查阅,小编已将OpenCV-Python专栏文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“文章”,如图:
或点击下方“阅读原文”,进入OpenCV-Python专栏,即可查看系列文章。
不断更新资源
获取更多精彩
长按二维码扫码关注
OpenCV系列之模板匹配 | 三十一相关推荐
- 基于opencv的图片模板匹配及其简单应用
opencv的图片模板匹配及其简单应用 我的个人博客 基础知识 基于opencv的图片模板匹配 注: python及其相关包的安装不在讨论范围内 opencv提供了图片模板匹配的方法, cv2.mat ...
- OpenCV中使用模板匹配识别空闲的货架空间
但是点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 假设你是一名在超市工作的员工,被要求在商店里四处走动,检查需要 ...
- OpenCV中的模板匹配
OpenCV中的模板匹配 在该demo中选取了两张猴哥的照片,一张用来获得模板,另外一张用模板去匹配. 下图为选取模板的图像: 以下为选取的匹配模板: 根据该模板在下面的图中找到猴哥的脸: 该demo ...
- OpenCV学习之模板匹配
模板匹配的概念与原理就不说了,<OpenCV3编程入门>这本书第9.5节有介绍,不过比较简洁,至于看不看得懂就NBCS了嘻嘻,毕竟本人也是看得一知半解.那么本次呢,主要就是针对该书中的9. ...
- opencv自适应尺寸模板匹配
opencv自带的模板匹配常规做法: 1.转换灰度图 cvtColor(img_template, img_template, CV_RGB2GRAY);cvtColor(org, org, CV_R ...
- opencv下通过模板匹配进行人体跟踪
本人学习opencv了半个月,学到模板匹配函数时灵感一动,写出了这个模板匹配的函数.特此,将我的灵感奉献给大家.废话不多说,代码贴上. #include "stdafx.h" #i ...
- OpenCV+python:模板匹配
1,模板匹配的概念及原理 模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术. 我们需要2幅图像: 模板 (T): 将和原图像比照的图像块 原图像 (I): 在这幅图像里,我们希望 ...
- opencv java match_OpenCV模板匹配函数matchTemplate详解
参考文档:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/histograms/template_matchin ...
- OpenCV中的模板匹配/Filter2d
1.模板匹配 模板匹配是在图像中寻找目标的方法之一.Come On, Boy.我们一起来看看模板匹配到底是怎么回事. 参考链接:http://www.opencv.org.cn/opencvdoc/2 ...
最新文章
- Clip Studio Paint 高级着色学习教程
- 面试题:css之品字布局?
- 直播卡顿原因详解及优化
- csu1377Putter HOJ12816
- vb.net連接ACCESS数据库
- 完整的一次 HTTP 请求响应过程(二)
- 02_Nginx基本配置与参数说明 + 辅助命令
- 860. 柠檬水找零 golang
- Spring Security 用户登录实战
- 如何在史上最糟糕的里约奥运会中活下去?(内附奥运赛事时间表)
- JAVA 反射(JAVA面试题)
- 产品生命周期管理PLM系统概述——睿思成研发管理咨询(www.wiserdm.com)
- CPU指令集存储位置在哪里?
- RQ dashboard使用
- HTML系列之水平线标签hr
- java 简单文件加密
- 50欧姆线设计 高频pcb_高频PCB设计:射频电路的布局的走线
- PHP基于微信小程序的医院预约挂号系统 uniapp 小程序
- 国产免费倾斜摄影模型在线发布平台,一键查看、编辑、分享场景!
- k-means聚类、以及二维、三维可视化
热门文章
- 树莓派 python 蜂鸣器_树莓派3b强行驱动无源蜂鸣器
- Keep客户端 In-App Purchase 掉单踩坑指南
- Python自定义高精度小数计算来获取巴塞尔问题的近似值
- 【技巧】用iFunBox将照片传到相机胶卷中
- Linux C TCP Socket实现客户与服务器简单通信
- iOS开源项目周报0406
- python连接mt4服务器_如何从MetaTrader 4/5终端向外部服务器发送数据?
- KNN(K-最近邻分类)分类算法
- window10+vs2022配置window驱动开发环境
- 制造企业如何开展客户满意度调查?上书房信息咨询为你解答