OpenCV学习(二十三) :模板匹配:matchTemplate(),minMaxLoc()

OpenCV学习(二十三) :模板匹配:matchTemplate()

1、概述

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

2、minMaxLoc()函数

寻找矩阵(一维数组当作向量,用Mat定义) 中最小值和最大值的位置。

void cv::minMaxLoc(	
InputArray 	src,				// 输入单通道阵列
double * 	minVal,				// 指向返回的最小值的指针;如果不需要,则使用NULL。
double * 	maxVal = 0,			// 指向返回的最大值的指针;如果不需要,则使用NULL。	
Point * 	minLoc = 0,			// 指向返回的最小位置的指针(二维情况下);如果不需要,则使用NULL。
Point * 	maxLoc = 0,			// 指向返回的最大位置的指针(二维情况下);如果不需要,则使用NULL。
InputArray 	mask = noArray() 	// 用于选择子数组的可选掩码。
)	

3、matchTemplate()函数

工作原理:在待检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。

matchTemplate(
InputArray image,		// 待搜索源图像,必须是8位整数或32位浮点
InputArray 	templ,		// 模板图像,必须不大于源图像并具有相同的数据类型。
OutputArray result,		// 表示匹配结果图像,必须是单通道32位浮点。如果image的尺寸为W x H,templ的尺寸为w x h,则result的尺寸为(W-w+1)x(H-h+1)
int method,				// 表示计算匹配程度的方法
InputArray 	mask = noArray() 	//搜索模板的掩码。它必须具有与templ相同的数据类型和大小。它不是默认设置的。
)	

1.几种常见的模板匹配算法:
在这里插入图片描述
1. cv::TM_SQDIFF平方差匹配法
计算模板与目标图像的方差,由于是像素值差值的平方的和,所以值越小匹配程度越高;

2. cv::TM_SQDIFF_NORMED归一化平方差匹配法
范化的cv::TM_SQDIFF,取值为0-1之间,完美匹配返回值为0;

3. cv::TM_CCORR相关匹配法
使用dot product计算匹配度(不清楚怎么计算dot product,没看过代码),越高匹配度就好;

4. cv::TM_CCORR_NORMED归一化相关匹配法
范化的cv::TM_CCORR,0-1之间,我用的这个;

5. cv::TM_CCOEFF系数匹配法
采用模板与目标图像像素与各自图像的平均值计算dot product,正值越大匹配度越高,负值越大图像的区别越大,但如果图像没有明显的特征(即图像中的像素值与平均值接近)则返回值越接近0;

6. cv::TM_CCOEFF_NORMED化相关系数匹配法
范化的cv::TM_CCOEFF,-1 ~ 1之间。

从上面的几个方法中,6比较符合目前需求:没有明显的特征,但2幅图像还是非常接近的,so,改为方法cv::TM_CCOEFF_NORMED。

总结:
1)前面方法(1)(2)为越小的值表示越匹配;方法(3)(4)(5)(6)值越大越匹配。
2)如果输入图像和模板图像都是彩色图像,则三个通道分别计算上述相似度,然后求平均值。
3)函数通过在输入图像image中滑动(从左到右,从上到下),寻找各个位置的区块(搜索窗口)与模板图像templ的相似度,并将结果保存在结果图像result中。该图像中的每一个点的亮度表示该处的输入图像与模板图像的匹配程度,然后可以通过某方法(一般使用函数minMaxLoc)定位result中的最大值或者最小值得到最佳匹配点,最后根据匹配点和模板图像的矩形框标出匹配区域
4)随着从简单的测量(平方差)到更复杂的测量(相关系数),我们可获得越来越准确的匹配(同时也意味着越来越大的计算代价)。

4、示例:6种模板匹配方法展示

1)载入一幅输入图像和一幅模板图像块 (template)
2)通过使用函数 matchTemplate 实现之前所述的6种匹配方法的任一个. 用户可以通过滑动条选取任何一种方法.
3)归一化匹配后的输出结果
4)定位最匹配的区域
5)用矩形标注最匹配的区域

#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;#define WINDOW_NAME1 "【原始图片】"        //为窗口标题定义的宏
#define WINDOW_NAME2 "【匹配窗口】"        //为窗口标题定义的宏Mat g_srcImage; Mat g_templateImage; Mat g_resultImage;
int g_nMatchMethod;
int g_nMaxTrackbarNum = 5;int main()
{printf("\n\n\t请调整滑动条观察图像效果\n\n");printf(  "\n\t滑动条对应的方法数值说明: \n\n""\t\t方法【0】- 平方差匹配法(SQDIFF)\n""\t\t方法【1】- 归一化平方差匹配法(SQDIFF NORMED)\n""\t\t方法【2】- 相关匹配法(TM CCORR)\n""\t\t方法【3】- 归一化相关匹配法(TM CCORR NORMED)\n""\t\t方法【4】- 相关系数匹配法(TM COEFF)\n""\t\t方法【5】- 归一化相关系数匹配法(TM COEFF NORMED)\n" );// 1、载入原图像和模板块g_srcImage = imread("F:/C++/2. OPENCV 3.1.0/TEST/aa.jpg", 1 );g_templateImage = imread( "F:/C++/2. OPENCV 3.1.0/TEST/bb.jpg", 1 );// 2、创建窗口namedWindow( WINDOW_NAME1, WINDOW_AUTOSIZE );namedWindow( WINDOW_NAME2, WINDOW_AUTOSIZE );// 3、创建滑动条并进行一次初始化createTrackbar( "方法", WINDOW_NAME1, &g_nMatchMethod, g_nMaxTrackbarNum, on_Matching );on_Matching( 0, 0 );waitKey(0);return 0;
}
void on_Matching( int, void* )
{// 1、给局部变量初始化Mat srcImage;g_srcImage.copyTo( srcImage );// 2、初始化用于结果输出的矩阵int resultImage_cols =  g_srcImage.cols - g_templateImage.cols + 1;int resultImage_rows = g_srcImage.rows - g_templateImage.rows + 1;g_resultImage.create( resultImage_cols, resultImage_rows, CV_32FC1 );// 3、进行匹配和标准化matchTemplate( g_srcImage, g_templateImage, g_resultImage, g_nMatchMethod );normalize( g_resultImage, g_resultImage, 0, 1, NORM_MINMAX, -1, Mat() );// 4、通过函数 minMaxLoc 定位最匹配的位置double minValue; double maxValue; Point minLocation; Point maxLocation;Point matchLocation;minMaxLoc( g_resultImage, &minValue, &maxValue, &minLocation, &maxLocation, Mat() );// 5、对于方法 SQDIFF 和 SQDIFF_NORMED, 即方法1 2越小的数值有着更高的匹配结果. (最黑的位置代表最高的匹配)// 方法 3 4 5 6 而其余的方法, 数值越大匹配效果越好(最白的位置代表最高的匹配)if( g_nMatchMethod  == TM_SQDIFF || g_nMatchMethod == TM_SQDIFF_NORMED ){ matchLocation = minLocation; }else{ matchLocation = maxLocation; }// 6、绘制出矩形,并显示最终结果rectangle( srcImage, matchLocation, Point( matchLocation.x + g_templateImage.cols , matchLocation.y + g_templateImage.rows ), Scalar(0,255,255), 2, 8, 0 );rectangle( g_resultImage, matchLocation, Point( matchLocation.x + g_templateImage.cols , matchLocation.y + g_templateImage.rows ), Scalar(0,255,255), 2, 8, 0 );imshow( WINDOW_NAME1, srcImage );imshow( WINDOW_NAME2, g_resultImage );
}

结果:
1)TM_SQDIFF 平方差匹配法
在这里插入图片描述
2)TM_SQDIFF_NORMED 归一化平方差匹配法
在这里插入图片描述
3)TM_CCORR 相关匹配法
在这里插入图片描述
4)TM_CCORR_NORMED 归一化相关匹配法
在这里插入图片描述
5)TM_CCOEFF 系数匹配法匹配法
在这里插入图片描述
6)TM_CCOEFF_NORMED 化相关系数匹配法
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS3实现图形曲线阴形和翘边阴影

首先&#xff0c;来看看完成之后的效果图&#xff1a; 实现原理 ①曲线阴影实现&#xff1a; 多个阴影重叠&#xff0c;就是正常阴影曲线阴影 正常情况下&#xff0c;有个矩形有正常的阴影&#xff0c;作为主投影&#xff0c;这时候再定义一个有一定弧度圆角的圆角矩形&#xf…

腾飞资本任溶 :互联网大脑,新的天方夜谭?—评《崛起的超级智能》

作者&#xff1a;任 溶 腾飞资本董事长&#xff0c;城市大脑创新合伙人基金管理合伙人因为我做科技产业投资工作&#xff0c;投资领域涉及互联网等新经济、新模式和新技术等&#xff0c;所以这几年总是听到一些言论&#xff0c;诸如“互联网已死”&#xff0c;或者“互联网红利…

OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()

OpenCV学习(二十四 &#xff09;&#xff1a;角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack() 参考博客&#xff1a; Harris角点检测原理详解 Harris角点检测原理及C实现 OpenCV亚像素角点cornerSubPixel()源代码分析 Taylor公式&#xff08;泰勒公式&#x…

无人驾驶技术的7大典型应用场景

来源 | 数据观综合无人驾驶风口来临&#xff0c;引得各方资本竞相追逐。据业内预测&#xff0c;2019年到2020年无人驾驶L3&#xff08;条件自动&#xff09;级别的汽车将实现量产化&#xff0c;2022年后部分企业将实现L4&#xff08;高度自动&#xff09;量产&#xff0c;若要实…

数字图像处理学习笔记(一):特征检测和匹配概述

数字图像处理学习笔记&#xff08;一&#xff09;&#xff1a;特征检测和匹配概述 参考博客&#xff1a; 特征点的匹配SIFT特征详解数字图像处理学习笔记&#xff08;二&#xff09;&#xff1a;SIFT&#xff08;尺度不变特征变换&#xff09;算法 1、特征点概述 如何高效且…

数字图像处理学习笔记(二):SIFT(尺度不变特征变换)算法

数字图像处理学习笔记&#xff08;二&#xff09;&#xff1a;SIFT&#xff08;尺度不变特征变换&#xff09;算法 一、概述&#xff1a; 提到特征点算法&#xff0c;首先就是大名鼎鼎的SIFT算法了。SIFT的全称是Scale Invariant Feature Transform&#xff0c;尺度不变特征变…

微软向马斯克的人工智能公司OpenAI投资10亿美元

来源: 新浪财经新浪美股讯微软(Microsoft)周一宣布&#xff0c;将向埃隆-马斯克(Elon Musk)的OpenAI投资10亿美元&#xff0c;打造能够处理更复杂任务的人工智能。根据声明&#xff0c;通过合作&#xff0c;两家公司将建立新的Azure AI超级计算技术&#xff0c;微软将成为OpenA…

数字图像处理学习笔记(三):ORB算法(尺度不变特征变换)Oriented FAST and Rotated BRIEF

数字图像处理学习笔记&#xff08;三&#xff09;&#xff1a;ORB算法&#xff08;尺度不变特征变换&#xff09;Oriented FAST and Rotated BRIEF 一、概述 参考&#xff1a;特征点匹配特征检测方法汇总 ORB的全称是Oriented FAST and Rotated BRIEF&#xff0c;是目前来说…

华为:对部分顶尖学生实行年薪制 最高200万元

来源&#xff1a;EETOP7月23日上午消息&#xff0c;据华为总裁办签发的电子邮件&#xff0c;华为对部分2019届顶尖学生实行年薪制管理。华为以电邮通知【2019】068号文发布了8名天才少年的年薪方案&#xff0c;这8名人员全部为2019届应届顶尖学生&#xff0c;其年薪的最低限为8…

matplotlib使用GridSpec自定义子图位置 (非对称的子图)

上图的结构可以用一下两种方式画&#xff1a; import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpecfig plt.figure(1) gs GridSpec(3, 3)ax1 plt.subplot(gs[0, :]) ax2 plt.subplot(gs[1, :2]) ax3 plt.subplot(gs[1:, 2]) ax4 plt.subplot(gs[…

大脑简史(1)-历史上的大事件

来源&#xff1a;人机与认知实验室能够上天入地&#xff0c;却不知道自己的大脑&#xff0c;笔者认为这是很多人的疑惑。随着科技的发展&#xff0c;我们能够延伸到的地方越来越多&#xff0c;无论是伸手不见五指的海底&#xff0c;还是扶摇直上九万里的浩渺星空&#xff0c;都…

作业3词频统计

(1). 实现一个控制台程序&#xff0c;给定一段英文字符串&#xff0c;统计其中各个英文单词&#xff08;4字符以上含4字符&#xff09;的出现频率。 答&#xff1a; 从文件读取遍历字符串大写转小写将句子分隔成一个个单词判断是否为单词计算单词出现的频率预估时间10minutes10…

MATLAB报错Invalid ADAPTORNAME specified. Type 'imaqhwinfo' for a list of available ADAPTORNAMEs. Image

MATLAB报错Invalid ADAPTORNAME specified. Type imaqhwinfo for a list of available ADAPTORNAMEs. Image acquisition adaptors may be available as downloadable support packages. Open Support Package Installer to install additional vendors. 这时需要安装两个安装…

陈天奇:十年机器学习科研之路(附链接)

来源&#xff1a;深度学习自然语言处理链接&#xff1a;https://zhuanlan.zhihu.com/p/74249758导读十年前&#xff0c;MSRA的夏天&#xff0c;刚开始尝试机器学习研究的我面对科研巨大的不确定性&#xff0c;感到最多的是困惑和迷茫。十年之后&#xff0c;即将跨出下一步的时候…

QT示例:基于TCP 点对多Socket通讯(server,clients)

QT示例&#xff1a;基于TCP 点对多通讯&#xff08;server,clients&#xff09;一、服务器server二、客户端Client下载&#xff1a;基于TCP 点对多Socket通讯 一、服务器server 因为对于客户端来说&#xff0c;只能连接一个服务器。而对于服务器来说&#xff0c;它是面向多连…

MATLAB GUI的CreateFcn如何创建

看MATLAB关于GUI代码的时候发现有一些function _CreateFcn(hObject, eventdata, handles)函数&#xff0c;那么这类函数是如何创建出出来的呢&#xff1f; 首先在MATLAB中输入guide&#xff0c;打开其中一个GUI文件&#xff0c;现在随便打开一个我之前创建好的GUI&#xff1a;…

文小刚:量子革命是最不可思议的物理革命

来源&#xff1a;科学网人类生活在一个怎样的世界里&#xff1f;凝聚态理论物理学家、美国麻省理工学院终身教授、美国科学院院士文小刚的答案是&#xff1a;“我们生活在量子计算机里面。量子信息是真实的&#xff0c;而所看到的各种物质、人&#xff0c;都是量子信息的虚拟反…

QT+Halcon综合示例:clip回形针2D位姿检测

QTHalcon综合示例&#xff08;一&#xff09;&#xff1a;clip回形针2D位姿检测0、halcon源码&#xff1a;1、Qt代码&#xff1a;2、运行结果&#xff1a;下载&#xff1a;clip回形针2D位姿检测 0、halcon源码&#xff1a; * clip.hdev: Orientation of clips * dev_close_w…

MATLAB GUI如何创建Callback函数

本文以创建按钮的Callback函数为例介绍了在MATLAB如何在GUI中创建Callback函数 首先在MATLAB中输入guide&#xff0c;打开GUI文件&#xff0c;这里我随机打开一个我之前创建的GUI文件&#xff1a; 假设现在要创建start按钮的Callback函数&#xff0c;则双击该按钮&#xff0c;…

互联网50年:从信息高速公路到超级智能的进化

来源&#xff1a;战略前沿技术编者按&#xff1a;2019年&#xff0c;迎来互联网诞生50周年。本文根据中信出版社7月出版的《崛起的超级智能&#xff1a;互联网大脑如何影响科技未来》一书的内容和观点&#xff0c;重点阐述了互联网是如何在50年中发生重大变化&#xff0c;如何促…