【精选】opencv-python 详解模板匹配matchTemplate_python- opencv模板匹配如何判定匹配成功还是失败_RayChiu_Labloy的博客-程序员宅基地

技术标签: python  opencv-python  计算机视觉  图像处理  目标检测  视觉检测  

作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处


         模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题。它是图像处理中最基本、最常用的匹配方法。模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效

        通俗来讲就是利用小图来找大图,可以看作是一种简陋的目标检测方法。它只是将模板图像滑动到输入图像上(就像在2D卷积中一样),然后在模板图像下比较模板和输入图像的拼图。举例来说,对于以下两张图片(大图为原图,左上角小图为样章),使用cv.matchTemplate()函数进行匹配,再使用cv.minMaxLoc()函数获得全局极值的位置和数值大小。

 先看第一个函数也是最重要的匹配方法:

result = cv.matchTemplate( image, templ, method[, result[, mask]] )
  • image:原图
  • templ:用于匹配的样章
  • method:原图与样章匹配效果的判别标准,参考链接:TemplateMatchModes
  • result:输出图片
  • mask:template的遮罩

其中method 有如下几种:
    CV_TM_SQDIFF:平方差匹配法;
    CV_TM_SQDIFF_NORMED:归一化平方差匹配法;
    CV_TM_CCORR:相关匹配法;
    CV_TM_CCORR_NORMED:归一化相关匹配法;
    CV_TM_CCOEFF:系数匹配法;
    CV_TM_CCOEFF_NORMED:化相关系数匹配法

对应公式:

在这里插入图片描述

公式计算过程详解:

在这里先谈一下matchTemplate()的result,result是一个结果矩阵,假设待匹配图像为 I,宽高为(W,H),模板图像为 T,宽高为(w,h)。那么result的大小就为(W-w+1,H-h+1) 。
        原因是因为,在匹配时,以模板大小的搜索框依次遍历整张图片时,每行需要遍历(W-w+1)次,每列需要遍历(H-h+1)。
        以下列矩阵为例:

        待匹配图像 I.Size(5,5),模板图像 T.Size(3,3)。以Size(3,3)的搜索框遍历图像I时,x方向需要遍历3次,y方向遍历3次。
        多观察发现,归纳出result.Size(W-w+1,H-h+1)。

        然后回到谈method,T 代表模板图像,I 代表待匹配图像。x ,y 代表当前搜索框在 I 矩阵中左上角元素的坐标。x' ,y' 代表T和搜索框框出来的 I 的矩阵的元素坐标。
        如下图:以归一化相关系数匹配方法为例。此时搜索框左上角坐标(x,y)=(0,0)。

对此搜索框内的矩阵和模板矩阵进行数据比较。
          第一步:减去均值。
          第二步:求俩矩阵内积,以及两个矩阵内元素平方和的平方的乘积。

 对公式研究发现:
               方差匹配方法:完全匹配会得到1, 完全不匹配会得到0。
               归一化方差匹配方法:完全匹配结果为0。
               相关性匹配方法:完全匹配会得到很大值,不匹配会得到一个很小值或0。
               归一化的互相关匹配方法:完全匹配会得到1, 完全不匹配会得到0。
               相关系数匹配方法:完全匹配会得到一个很大值,完全不匹配会得到0,完全负相关会得到很大的负数。
      (此处与书籍以及大部分分享的资料所认为不同,研究公式发现,只有归一化的相关系数才会有[-1,1]的值域)
               归一化的相关系数匹配方法:完全匹配会得到1,完全负相关匹配会得到-1,完全不匹配会得到0。 

再来看另一个函数:

minVal,maxVal,minLoc,maxLoc=cv.minMaxLoc(src [,mask])

函数功能:假设有一个矩阵a,现在需要求这个矩阵的最小值,最大值,并得到最大值,最小值的索引。咋一看感觉很复杂,但使用这个CV2.minMaxLoc()函数就可全部解决。函数返回的四个值就是上述所要得到的。

实验代码:

import cv2
import numpy as np

img = cv2.imread("E:/Users/raychiu/Desktop/simpsons.jpg")
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
template = cv2.imread("E:/Users/raychiu/Desktop/barts_face.jpg", cv2.IMREAD_GRAYSCALE)
cv2.imshow("template", template)
cv2.imshow("gray_img", gray_img)
w, h = template.shape[::-1]

result = cv2.matchTemplate(gray_img, template, cv2.TM_CCOEFF_NORMED)

minval, maxval, minloc, maxloc = cv2.minMaxLoc(result)
print(minval, maxval, minloc, maxloc)

loc = np.where(result >= 0.6)
# for pt in zip(*loc[::-1]):
#     cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 3)

pt = maxloc
cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 3)

cv2.imshow("img", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

参考:OpenCV-Python系列之模板匹配 - 哔哩哔哩

           https://blog.csdn.net/qq_42791845/article/details/103700503

【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/RayChiu757374816/article/details/119609851

智能推荐

1012:计算多项式的值-程序员宅基地

文章浏览阅读2.8k次。时间限制: 1000 ms 内存限制: 65536 KB 提交数: 11161 通过数: 7420 【题目描述】对于多项式f(x)=ax3+bx2+cx+d和给定的a,b,c,d,x,计算f(x)的值,保留到小数点后7位。【输入】输入仅一行,包含5个实数,分别是x,及参数a、b、c、d的值,每个数都是绝对值不超过100的双精度浮点数。数与数之间以一...

Python100天打卡-Day11-文件和异常_python100天code day11-程序员宅基地

文章浏览阅读215次。文件和异常在实际开发中,常常需要对程序中的数据进行持久化操作,而实现数据持久化最直接简单的方式就是将数据保存到文件中。通过Python内置的open函数,我们可以指定文件名、操作模式、编码信息等来获得操作文件的对象,接下来就可以对文件进行读写操作了。操作模式:打开什么样的文件(字符文件还是二进制文件)做什么样的操作(读、写还是追加)对应的图解如下:读写文本文件读取读取文..._python100天code day11

给WordPress前台和后台指定不同的favicon(网站图标)-程序员宅基地

文章浏览阅读1.2k次。移步到个人小站:www.very321.com你是否遇到过以下问题? 我们可能打开很多窗口,由于前端和后端系统的网站图标都是一样的,所以我们几乎无法从这些窗口中辨认我们的博客以及其他窗口的具体内容。 于是从好几个打开的博客文章窗口中寻找管理页面窗口就成了件麻烦事。 下面的截图就是这样的情况:你可以稍微改动一下主题中的functions.php文件来解决这个问

ios 创建和绘画pdf文件-程序员宅基地

文章浏览阅读4.9k次。本方法为项目中画pdf的一个方法,画pdf,一共分为几步,1,获取地址,有两种获取地址方法,这是其中一种,2,关联上下文后开始绘画pdf,开始新的一页后必须用cgcontentbeginpage方法开始新的一页,从新设置坐标,等属性。3,释放。pdf就是个画布,我们是往上面画东西,而不是写东西,还有就是pdf用的坐标系是数学坐标,左下角为原点,而不是编程里常用的左上角为为坐标原点~一下是源码,重复_绘画pdf

MFC RadioButton背景颜色改变(可以照此实现别的效果)_mfc radiobutton 颜色-程序员宅基地

文章浏览阅读4.4k次。HBRUSH CLZS_DLG_FXMOSHI_CHILD::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);//Radio按钮背景TCHAR szClassName[MAX_PATH]={0};::GetCla_mfc radiobutton 颜色

如何用IC卡智能卡读卡器修改Mifare1(M1)卡的秘钥KeyA和KeyB?_读卡器的验证方式修改-程序员宅基地

文章浏览阅读6.2k次。M1卡有16个扇区(0-15),每个扇区有4块(0-3)每个扇区有两个控制秘钥,分为KeyA 和KeyBKeyA、KeyB存储在对应扇区的03块,例如要修改第0扇区的秘钥,先用软件读第0扇区第3块的内容,用HEX方法读,如下:000000000000FF078069FFFFFFFFFFFF其中中间8位FF078069是不能改动的,右边12位(FFFFFFFFFFFF)是KeyB,左边12位(000000000000)是KeyA需要注意的是右边12位读取出来是准确的现在卡的KeyB,左边12位读._读卡器的验证方式修改

随便推点

1.25 Tic-tac-toe_write a tic-tac-toe game-程序员宅基地

文章浏览阅读1.6k次。描述:Certainly, everyone is familiar with tic-tac-toe game. The rules are very simple indeed. Two players take turns marking the cells in a3 × 3grid (one player always draws crosses, the other — noughts). The player who succeeds first in placing three of.._write a tic-tac-toe game

vue进行判断使用class_vue 动态添加class,三个以上的条件做判断方式_炸酱李的博客-程序员宅基地

文章浏览阅读1.7w次。vue 动态添加class,三个以上的条件做判断方式如果 status为1,样式为redRoom如果 status为2,样式为greenRoom1如果 status为其他,样式为greenRoom2:class="{'redRoom': Number(items.status) === 1, 'greenRoom1': Number(items.status) === 2, greenRoom2:..._vue class 条件

VC中的注册表操作(VC_Win32)_vc运行库注册表配置-程序员宅基地

文章浏览阅读7k次,点赞4次,收藏5次。目录注册表概述注册表相关函数详解注册表编程(本章节中例子都是用 VS2005 编译调试的)注册表概述概述注册表是windows操作系统中的一个核心数据库,其中存放着各种参数,直接控制着windows的启动、硬件驱动程序的装载以及一些windows应用程序的运行,从而在整个系统中起着核心作用.这些作用包括了软、硬件的相关配置和状态信息,比如注册表中_vc运行库注册表配置

网络_RIP v1基本部署_RIP计时器_触发更新(中毒路由)_RIP路由协议算法_RIP形成环路的原因_RIP解决环路的方法_RIP v2部署-程序员宅基地

文章浏览阅读1k次。一、环境GNS3、secureCRT二、RIP协议部署将拓扑搭建成如图所示,并为其每个接口设置ip地址,每个路由器创建换回接口如图所示。操作可参见之前博文。部署RIP协议R1配置命令R1(config)#router rip R1(config-router)#network 12.0.0.0R1(config-router)#network 1.0.0.0 R1(config...

复数的 加减乘除 运算。_两个复数加减乘除运算题-程序员宅基地

文章浏览阅读7.8k次,点赞6次,收藏37次。用友员运算符重载函数 来实现复数的加减乘除运算。两个复数a+bi和c+di加减乘除的方法如下:加法:(a+bi)+(c+di)=(a+c)+(b+d)i减法:(a+bi)-(c+di)=(a-c)+(b-d)i乘法:(a+bi)*(c+di)=(ac-bd)+(ad+bc)i除法:(a+bi)/(c+di)=((a+bi)*(c-di))/(c^2+d^2) 声明一个复数类C..._两个复数加减乘除运算题