Opencv使用cv::matchTemplate进行模板匹配
一. 使用matchTemplate函数进行图像模板匹配
什么是模板匹配?
答:模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术.
所需函数:matchTemplate
函数名:matchTemplate
函数功能:在目标图像中匹配模板图像!
函数原型:
void matchTemplate( InputArray image, InputArray templ,OutputArray result, int method );
参数介绍:
InputArray image: 目标图像
InputArray templ:模板图像,注意模板图像的颜色位深度与通道必须与目标图像一致
OutputArray result:匹配结果图像。必须是单通道32位浮点型,且大小是(W-w+1)*(H-h+1),其中W,H分别为输入图像的宽和高,w,h分别为模板图像的宽和高。
int method:相似度衡量的方法。具体如下
- 平方差匹配 method=CV_TM_SQDIFF
这类方法利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大.
标准平方差匹配 method=CV_TM_SQDIFF_NORMED
相关匹配 method=CV_TM_CCORR
这类方法采用模板和图像间的乘法操作,所以较大的数表示匹配程度较高,0标识最坏的匹配效果.
标准相关匹配 method=CV_TM_CCORR_NORMED
相关匹配 method=CV_TM_CCOEFF
这类方法将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列).
在这里
标准相关匹配 method=CV_TM_CCOEFF_NORMED
通常,随着从简单的测量(平方差)到更复杂的测量(相关系数),我们可获得越来越准确的匹配(同时也意味着越来越大的计算代价). 最好的办法是对所有这些设置多做一些测试实验,以便为自己的应用选择同时兼顾速度和精度的最佳方案.
函数名:minMaxLoc
函数功能:寻找image矩阵里的最大值和最小值
函数原型:
void minMaxLoc(InputArray src, CV_OUT double* minVal,CV_OUT double* maxVal=0, CV_OUT Point* minLoc=0,CV_OUT Point* maxLoc=0, InputArray mask=noArray());
参数介绍:
参数1:InputArray类型的src,输入单通道数组(图像)。
参数2:double*类型的minVal,返回最小值的指针。若无须返回,此值置为NULL。
参数3:double*类型的maxVal,返回最大值的指针。若无须返回,此值置为NULL。
参数4:Point*类型的minLoc,返回最小位置的指针(二维情况下)。若无须返回,此值置为NULL。
参数5:Point*类型的maxLoc,返回最大位置的指针(二维情况下)。若无须返回,此值置为NULL。
参数6:InputArray类型的mask,用于选择子阵列的可选掩膜。
返回值:无
二. 编写代码
开始前需要准备一张原图,和一张模板图
原图如下:
模板图如下:
如有需要可自行把保存本地JPG格式!
3.1 开始编写代码
注意该函数存在于cv空间中,采用c++的名字空间方式编写而成的,所以我们要去掉名字空间!在main函数前面加上:using namespace cv;来去掉名字空间!
当然如果你担心作用域冲突也可以不加!
using namespace cv;
3.2 加载原图和模板图
//加载源图像和模板图像
Mat image = imread("d:\\a.jpg");
Mat image_demo = imread("d:\\b.jpg");
3.3 创建一个图像用于存储mat算法结果图
Mat image_matched;//用于存储结果图
3.4 模板匹配
使用的是TM_CCOEFF_NORMED算法!经过多次测试发现TM_CCOEFF_NORMED算法最为准确!
//模板匹配
matchTemplate(image, image_demo, image_matched, TM_CCOEFF_NORMED);
3.5 寻找最佳的匹配位置
double minVal, maxVal;
Point minLoc, maxLoc;
//寻找最佳匹配位置
minMaxLoc(image_matched, &minVal, &maxVal, &minLoc, &maxLoc);
3.6 将对应区域规划出来
//绘制图像circle(image, Point(maxLoc.x + image_demo.cols / 2, maxLoc.y + image_demo.rows / 2), 50/*根据模板尺寸修改该值*/, Scalar(0, 0, 255), 2, 8, 0);
3.7 显示图像
//显示图像imshow("image", image);imshow("image_demo", image_demo);imshow("image_matched", image_matched);waitKey(0); //message
运行结果:
完整代码:
//加载源图像和模板图像 Mat image = imread("d:\\a.jpg");Mat image_demo = imread("d:\\b.jpg");Mat image_matched;//用于存储结果图//模板匹配 matchTemplate(image, image_demo, image_matched, TM_CCOEFF_NORMED);double minVal, maxVal;Point minLoc, maxLoc;//寻找最佳匹配位置 minMaxLoc(image_matched, &minVal, &maxVal, &minLoc, &maxLoc);//绘制图像Mat image_color;circle(image, Point(maxLoc.x + image_demo.cols / 2, maxLoc.y + image_demo.rows / 2), 50, Scalar(0, 0, 255), 2, 8, 0);//显示图像imshow("image", image);imshow("image_demo", image_demo);imshow("image_matched", image_matched);waitKey(0); //message
Opencv使用cv::matchTemplate进行模板匹配相关推荐
- OpenCV学习(二十三) :模板匹配:matchTemplate(),minMaxLoc()
OpenCV学习(二十三) :模板匹配:matchTemplate() 1.概述 模板匹配是一种最原始.最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配 ...
- OpenCV中的图像处理 —— 傅里叶变换+模板匹配
OpenCV中的图像处理 -- 傅里叶变换+模板匹配 现在也在逐渐深入啦,希望跟大家一起进步越来越强 目录 OpenCV中的图像处理 -- 傅里叶变换+模板匹配 1. 傅里叶变换 1.1 Numpy实 ...
- OpenCV实现基于形状的模板匹配(附源码)
效果预览 OpenCV实现基于形状的模板匹配(多角度+不同亮度) 实例演示一: 实例演示二: 实例演示三: 实例演示四: 实例演示五: 实例演示六ÿ
- OpenCV(二十)模板匹配
目录 一.基础理论 1.作用与过程 2.原理 3.函数matchTemplate 二.代码 三.效果 参考资料 一.基础理论 1.作用与过程 所谓的模板匹配,就是在给定的图片中查找和模板最相似的区域, ...
- opencv (二十七)模板匹配
opencv 模板匹配 一 简单实现 二 函数及原理讲解 1 matchTemplate()参数详解 2 minMaxLoc()函数 3 MatchTemplate()中的参数"result ...
- Opencv学习笔记——直方图与模板匹配
文章目录 一.直方图 1.画直方图 2.mask的使用 3.直方图均值化 4.自适应直方图均衡化 二.模板匹配 1.匹配单个对象 2.匹配多个对象 一.直方图 直方图是像素点数值分布的统计图形表示,也 ...
- android 图片特征提取比对_计算机视觉 OpenCV Android | 基本特征检测 之 模板匹配...
模板匹配的 概述 以及 使用简介模板匹配是最简单的模式识别算法之一, 其在图像处理中经常用于从一副未知图像中, 根据预先定义好的模板图像来寻找与模板图像相同或者高度相似的子图像区域. 所以模板匹配需要 ...
- OpenCV 实现基于边界的模板匹配-适用部分覆盖和光照变化情况
介绍 模板匹配是一个图像处理问题,当其姿态(X,Y,θ)未知时,使用另一张搜索图像中的模板图像找到对象的位置.在本文中,我们实现了一种算法,该算法使用对象的边缘信息来识别搜索图像中的对象. 背景 由于 ...
- python opencv数字识别_基于模板匹配的手写数字识别(python+opencv)
智能计算课第一周的实验是做基于模板匹配的手写数字识别,光听见就很感兴趣,于是决定认真做做这个实验,本实验基于python3+opencv的python版本,所用到的知识都比较简单,基本上边学边做,技术 ...
最新文章
- python中使用flask实现人脸实时检测
- C#.NET通用权限管理在DB2数据库上运行的脚本参考 - 序列创建脚本参考
- ubuntu 安装ImageMagic
- 36岁 计算机博士,36岁考博士
- inet_pton函数和inet_ntop函数的用法及简单实现
- 机器学习的下一站:AutoML | 文末送书
- activity动态加签任意节点
- linux生成的pdf文件,把LINUX MAN PAGE生成为PDF文件的脚本
- Mongo DB命令简介
- 台式计算机视频设备打不开,电脑视频设备被占用未能创建视频预览怎么办
- Dart基础第7篇:函数的定义 可选参数 默认参数 命名参数
- TinyMind 和机器之心收藏
- hdu acm 1540
- 南京大学计算机科学与技术,南京大学计算机科学与技术系简介
- C语言删除注册表某个键值,怎么批量快速删除注册表中指定的某个键值
- 什么是java 比特率_比特率问题(32位对64位)
- XP纯净版光盘ISO镜像文件
- 我的世界空岛生存服务器制作,我的世界Wishing服务器-RPG丨空岛丨生存丨[1.12.2-1.16.1]...
- Python TODO说明
- 微信支付:请求参数与订单信息不一致
热门文章
- oracle怎么存视频地址,oracle的警告文件存储方式和地址
- python3 自定义排序_Python3中的自定义排序
- python程序员工资高吗_Python程序员必备:EDA数据分析神器,老板疯狂加工资
- Linux下修改mysql密码以及忘记密码重置
- 云端服务器只能查看文件,云端服务器只能查看文件夹
- java获取网卡正真的mac_java获取网卡的mac地址
- linux创建环境变量有什么用,环境变量和shell变量到底有什么区别呢?
- Activiti添加批注(comment)信息
- jquery.autocomplete自动完成控件
- 控制台修改应用端口_应用架构六边型架构:三个原则和一个实现示例