模板匹配的概念与原理就不说了,《OpenCV3编程入门》这本书第9.5节有介绍,不过比较简洁,至于看不看得懂就NBCS了嘻嘻,毕竟本人也是看得一知半解。那么本次呢,主要就是针对该书中的9.5.3的示例程序,解释几个部分的代码,由于本人也是初学,所以全凭个人理解,所以讲不一定很高深,大家不要逼太紧靴靴!

示例程序

本来觉得代码没必要贴出来的,但怕有些人太懒噜不想看书,或者是书都没有的可人儿逼太紧,还是秉着做好事、说好话、存好心的三好精神,在下方贴出整个代码吧。由于本人自己敲得,所以和书上顺序神马的不一样,但总体是没有什么问题的靴靴!

#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
using namespace cv;Mat g_srcImage, g_templateImage, g_resultImage;
int g_nMatchMethod;
int g_nMaxTrackbarNum = 5;void on_Matching(int, void*)//回调函数
{Mat srcImage;g_srcImage.copyTo(srcImage);//初始化用于结果输出的矩阵int resultImage_rows = g_srcImage.rows - g_templateImage.rows + 1;int resultImage_cols = g_srcImage.cols - g_templateImage.cols + 1;g_resultImage.create(resultImage_rows, resultImage_cols, CV_32FC1);//进行匹配和标准化matchTemplate(g_srcImage, g_templateImage, g_resultImage, g_nMatchMethod);normalize(g_resultImage, g_resultImage, 0, 1, NORM_MINMAX, -1, Mat());//归一化数据//通过函数minMaxLoc定位最匹配的位置double minValue, maxValue;Point minLocation, maxLocation, matchLocation;minMaxLoc(g_resultImage, &minValue, &maxValue, &minLocation, &maxLocation, Mat());//使用方法SQDIFF和SQDIFF_NORMED,越小的数值有着更高的匹配结果,而其余的方法,数值越大匹配效果越好if (g_nMatchMethod == TM_SQDIFF || g_nMatchMethod == CV_TM_SQDIFF_NORMED)matchLocation = minLocation;elsematchLocation = maxLocation;//绘制出矩形,并显示最终结果rectangle(srcImage, matchLocation, Point(matchLocation.x + g_templateImage.cols, matchLocation.y + g_templateImage.rows), Scalar(0, 0, 255), 2, 8, 0);rectangle(g_resultImage, matchLocation, Point(matchLocation.x + g_templateImage.cols, matchLocation.y + g_templateImage.rows), Scalar(0, 0, 255), 2, 8, 0);imshow("【原始图片】", srcImage);imshow("【效果窗口】", g_resultImage);
}int main()
{g_srcImage = imread("linlin.jpg");g_templateImage = imread("linlinface.PNG");namedWindow("【原始图片】", CV_WINDOW_AUTOSIZE);namedWindow("【效果窗口】", CV_WINDOW_AUTOSIZE);createTrackbar("方法", "【原始图片】", &g_nMatchMethod, g_nMaxTrackbarNum, on_Matching);on_Matching(0, 0);waitKey(0);return 0;
}

代码讲解

int resultImage_rows = g_srcImage.rows - g_templateImage.rows + 1;
int resultImage_cols = g_srcImage.cols - g_templateImage.cols + 1;

这两行主要是求Mat变量g_resultImage的长宽,即尺寸,该变量对应的就是matchTemplate()函数中都第三个参数result,比较结果的映射图像。至于为什么这么求,书中有提到必须是(W-w+1)x(H-h+1),原理是什么书上也没提呕!个人理解,可能跟模板匹配的原理有关。模板匹配是通过一个图像模板,在整幅输入图像上移动这个模块来寻找图像中相似的最优匹配。至于映射效果呢,其实就是为了方便比较,所以要缩小尺寸来放大匹配部分,方便进行比较不同方法的匹配效果。Of course,一切都是本人理解的靴靴,至于是不是这样的本人清者自清。当然,也欢迎知道的童鞋在评论方留言厚!

matchTemplate(g_srcImage, g_templateImage, g_resultImage, g_nMatchMethod);
normalize(g_resultImage, g_resultImage, 0, 1, NORM_MINMAX, -1, Mat());

第一行就是调用matchTemplate()函数,没什么好说的,主要是第二行的normalize()函数,有篇文章写得比较详细,大家可以看看:opencv函数介绍(1)——normalize按这篇文章来讲,应该是范围归一化数据,运用Image Watch可以看到归一化后的g_resultImage图像的像素值都在(0,1)之间,正好符合normalize()函数中的0,1的上下限,效果图如下:

rectangle(srcImage, matchLocation, Point(matchLocation.x + g_templateImage.cols, matchLocation.y + g_templateImage.rows), Scalar(0, 0, 255), 2, 8, 0);
rectangle(g_resultImage, matchLocation, Point(matchLocation.x + g_templateImage.cols, matchLocation.y + g_templateImage.rows), Scalar(0, 0, 255), 2, 8, 0);

然后就是绘制矩形的代码,原图和映射图像分别绘制,其实就是匹配的区域而已。简单介绍一下rectangle()函数的参数,方便大家使用厚!
第一个参数,要绘制矩形的图像;
第二个参数,矩形的左上角坐标,也就是求得的匹配位置的坐标点;
第三个参数,矩形的右下角坐标,代码中是左上角横纵坐标加上模板图像的长宽求得,容易理解,因为矩形要和模板一样惹;
第四个参数,矩形的边的颜色厚,BGR颜色你自己调靴靴;
第五个参数,thickness线宽;
第六个参数,lineType线型;
第七个参数,int shift=0??,我也没看明白,应该是与坐标点有关,选默认值就好了噜。

g_templateImage = imread(“linlinface.PNG”);

这个书上也没解释呕,真素懒死噜!想直接用代码的人可能就会懵逼厚,这是个啥图?其实细看书的话还是能明白的,就是模板图像厚,也就是你想要匹配的部分,你从原图中截个图就好噜,so easy的靴靴!

实验效果

其它没什么好说的了,给大家看看效果吧!选用的是宇宙天后的婊情嘻嘻,映射结果就不给大家看了,意思都一样,结果如下所示:






可以看到,只有方法二(相关匹配法)不本质,没有成功匹配到天后的美貌,真素不努力,迟早被吸。其它的方法都成功匹配到了,相差都不大,都是畏惧神淋罢了嘻嘻!

OpenCV学习之模板匹配相关推荐

  1. opencv学习_11 (模板匹配(包括单模板和多模板))

    模板匹配--在一幅图像中匹配与模板相似的单个或者多个目标 (1)目标匹配函数: cvMatchTemplate( const CvArr* image, constCvArr* templ, CvAr ...

  2. OpenCV中使用模板匹配识别空闲的货架空间

    但是点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 假设你是一名在超市工作的员工,被要求在商店里四处走动,检查需要 ...

  3. OpenCV系列之模板匹配 | 三十一

    目标 在本章中,您将学习 使用模板匹配在图像中查找对象 你将看到以下功能:cv.matchTemplate(),cv.minMaxLoc() 理论 模板匹配是一种用于在较大图像中搜索和查找模板图像位置 ...

  4. OpenCV中的模板匹配

    OpenCV中的模板匹配 在该demo中选取了两张猴哥的照片,一张用来获得模板,另外一张用模板去匹配. 下图为选取模板的图像: 以下为选取的匹配模板: 根据该模板在下面的图中找到猴哥的脸: 该demo ...

  5. 基于opencv的图片模板匹配及其简单应用

    opencv的图片模板匹配及其简单应用 我的个人博客 基础知识 基于opencv的图片模板匹配 注: python及其相关包的安装不在讨论范围内 opencv提供了图片模板匹配的方法, cv2.mat ...

  6. OpenCV中的模板匹配/Filter2d

    1.模板匹配 模板匹配是在图像中寻找目标的方法之一.Come On, Boy.我们一起来看看模板匹配到底是怎么回事. 参考链接:http://www.opencv.org.cn/opencvdoc/2 ...

  7. OpenCV笔记:模板匹配 cv2.matchTemplate()、cv2.minMaxLoc() 与 绘制矩形 cv2.rectangle() 方法介绍

    导读 模板匹配是用来在一副大图中搜寻查找模版图像位置的方法.绘制矩形是用来将模版图像的匹配结果展示出来的方法. 模板匹配实现简单(2~3行代码),计算效率高,不需要执行阈值化.边缘检测等操作来生成二值 ...

  8. opencv自适应尺寸模板匹配

    opencv自带的模板匹配常规做法: 1.转换灰度图 cvtColor(img_template, img_template, CV_RGB2GRAY);cvtColor(org, org, CV_R ...

  9. opencv下通过模板匹配进行人体跟踪

    本人学习opencv了半个月,学到模板匹配函数时灵感一动,写出了这个模板匹配的函数.特此,将我的灵感奉献给大家.废话不多说,代码贴上. #include "stdafx.h" #i ...

最新文章

  1. 卷积神经网络学习笔记与心得(4)池化
  2. layout-maxWidth属性用法
  3. 数学知识复习:二阶导复合函数的链式法则
  4. IM群聊消息如此复杂,如何保证不丢不重?
  5. C++ 反射机制的简单实现
  6. [virtualenvwrapper] 命令小结
  7. 【STC15库函数上手笔记】7、PCA与PWM
  8. R中‘ts‘ object must have one or more observations
  9. oracle和Linux能兼容吗,Oracle基于Linux 7下的安装
  10. java token 超时_前后端分离——token超时刷新策略
  11. 通过PyMuPDF编写增值税发票多PDF文件合并工具
  12. 笔记本无线自动配置服务器,笔记本无线网络连接IP地址怎么设置
  13. 关于读书,请你丢掉对书本的敬畏感
  14. 独立样本t检验及其在SPSS中的实现
  15. mysql数据库教学系统设计_MySQL-教学系统数据库设计
  16. 水星路由器DNS服务器未响应,新买的水星(MERCURY)路由器怎么设置?
  17. echart折线图信息配置及点击事件
  18. php html 字符串 转 数组 用于小程序转换
  19. DevOps到底是什么?
  20. 快消企业数字化转型如何落地

热门文章

  1. 【Android性能】【流畅度】概念初识
  2. Win10 Thinkpad CarbonX1 6th gen笔记本检测不到外接显示器的问题
  3. 我的世界为什么服务器不显示皮肤,我的世界为什么皮肤没显示,为什么皮肤显示不出来怎么办...
  4. python 安卓平板_10 个可以在平板电脑上使用的 Python 编辑器 ,让编程更贴近生活!...
  5. HDU 自动刷题机 Auto AC (轻轻松松进入HDU首页)
  6. 使用蒲公英给iOS应用做内测
  7. C# 读取.txt文档和.docx文档。npoi读取word文档
  8. 诗人的眼泪(曾轶可)
  9. Codeforces 841B - Godsend
  10. Discord一直连不上,转圈圈打不开——解决办法