本次要整理记录的内容是:模板匹配。
模板匹配可以说是一种最简单的模式识别方法,它的实现主要是通过模板图像在被匹配图像中的平移,在被匹配图像中逐个区域寻找和模板图像相似的区域,如果存在某区域的相似度大于一定的阈值,则表明该区域和模板图像是相匹配的。
但是模板匹配这种方式具有很大的自身局限性,首先它利用一个规定好的模板进行匹配,这就导致了想要匹配出来的结果必须在大小和角度上和模板图像一模一样,一旦原图像中的匹配目标发生旋转或大小变化,就会导致匹配准确率急剧下降。而且模板图像在原图像中进行移动的时候,只能够平行地上、下、左、右移动,对于有经过投影变换的图像,这种模板匹配寻找目标的方式可以说是完全无效的。同时,这种模板匹配方式对于图像的光照变换是十分敏感的,如果是对同一物体在不同光照环境下拍摄,并进行模板匹配,是很难得出令人满意的效果,模板匹配只适用于光照条件影响很小的匹配任务,工作条件限制比较严格,这也很大的限制了它的应用性。但是对于一些光照不变的图像,在经过预处理之后,还是可以使用模板匹配的方式来寻找匹配目标的。
OpenCV中提供了matchTemplate(image, templ, result, method,mask)这个API来实现模板匹配功能。
第一个参数image:输入的包含匹配目标的图像;
第二个参数templ:进行匹配所用的模板图像;
第三个参数result:输出的匹配结果,为浮点型的Mat对象,其高度是find_image.rows - tem_image.rows + 1 ,宽度是find_image.cols - tem_image.cols + 1
第四个参数method:使用的计算像素相似度的方式,主要有三种可选方式
(1)TM_SQDIFF_NORMED:平方不同(归一化)值在0~1之间,1表示完全不匹配,0表示高度匹配
(2)TM_CCORR_NORMED:相关性(归一化),值在0~1之间,1表示高度匹配,0表示完全不匹配
(3)TM_CCOEFF_NORMED:相关因子(归一化),值在0~1之间,1表示高度匹配,0表示完全不匹配
第五个参数mask:使用的掩膜,没有掩膜的话不用输入直接使用默认值就可以。
下面给出一个模板匹配的代码实现:

 Mat find_image;find_image = imread("D:\\opencv_c++\\opencv_tutorial\\data\\images\\tyt.png");Mat tem_image;tem_image = imread("D:\\opencv_c++\\opencv_tutorial\\data\\images\\tyt_template.png");Mat result;matchTemplate(find_image, tem_image, result, TM_CCOEFF_NORMED);int result_h = result.rows;           //find_image.rows - tem_image.rows +1int result_w = result.cols;          //find_image.cols - tem_image.cols +1float threshold = 0.85;              //判断是否与模板相匹配的阈值for (int row = 0; row < result_h; row++){for (int col = 0; col < result_w; col++){float value = result.at<float>(row, col);if (value > threshold)          {Rect rect(col, row, tem_image.cols, tem_image.rows);rectangle(find_image, rect, Scalar(0, 0, 255), 2, LINE_AA, 0);}}}imshow("find_image", find_image);

首先读入一张待匹配图像和一张模板图像,然后通过matchTemplate()来得到一个表示相似度的浮点型矩阵,这个矩阵中每一个点都是通过与模板进行对比后得到的相似度。再后面使用两个for循环对这个矩阵的所有坐标点进行遍历,获取每个坐标点的值并与设定的阈值进行比较,如果该坐标点值(相似度)大于阈值,说明这里存在一个与模板相匹配的目标,就将相似性大于阈值的点作为绘制目标矩形的锚点坐标,也就是矩形左上角的点,将模板的尺寸作为绘制目标矩形的尺寸,绘制出矩形将目标标记出来。这就实现是对目标的模板匹配操作。具体效果如下:
这是模板图像,是从原图像中裁剪出来的一小块

然后是待匹配图像

这是匹配得到的结果:

可见输出结果中很好的将待寻找目标给标记了出来,但这是在原图像进行操作,下面将原图像通过像素值的添加进行亮度调节后再进行匹配,看看效果。

这里对原图的像素值都提升了150,虽然图像内容没有发生改变,但是像素值一变化,导致模板匹配操作无法达到之前那么好的效果了,可见模板匹配的鲁棒性是很差的。
总结:对于光照固定的图像进行目标检测,可以通过模板匹配来实现,但如果光照等外界因素变化对图像影响比较大,则模板匹配的效果会大幅下降。模板匹配只能作为一种基本的、入门的目标检测方式。
本次整理到此结束,谢谢阅读。

PS:本人的注释比较杂,既有自己的心得体会也有网上查阅资料时摘抄下的知识内容,所以如有雷同,纯属我向前辈学习的致敬,如果有前辈觉得我的笔记内容侵犯了您的知识产权,请和我联系,我会将涉及到的博文内容删除,谢谢!

OpenCV4学习笔记(19)——模板匹配相关推荐

  1. OpenCV 学习笔记(模板匹配)

    OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够 ...

  2. halcon学习笔记(14)——模板匹配

    halcon的模板匹配种类有很多种,方法各有优缺点,一般有基于灰度的匹配,基于形状的匹配等等,这里具体理论和方法不做详解,只简单总结一个实例.图像匹配一般需要对旋转放缩进行处理,另外为了提高搜索效率, ...

  3. Halcon学习笔记之模板匹配-基于形状的多模板匹配

    基于形状的模板匹配在我们实际的项目中应用最广,同时在一些项目中,光是选中一个目标作为匹配的模板,效果可能还达不到我们所需要达到的要求或者我们所需要检测的目标存在多个特征需要去判别,所以这个时候可以考虑 ...

  4. OpenCV4学习笔记(41)——ORB特征提取描述算法

    今天要整理记录的笔记内容是特征算法中比较常用的一种--ORB特征提取描述算法,顾名思义,ORB算法包含了对特征点的提取和描述这两个部分.而在上次的博文<OpenCV4学习笔记(39)>中, ...

  5. springmvc学习笔记(19)-RESTful支持

    springmvc学习笔记(19)-RESTful支持 标签: springmvc springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控 ...

  6. OpenCV4学习笔记(47)——BRISK特征提取描述算法

    今天要整理记录的是OpenCV中BRISK特征提取描述算法的运用. BRISK特征提取描述算法全称为 Binary Robust Invariant Scalable Keypoints(二进制鲁棒不 ...

  7. Ext.Net学习笔记19:Ext.Net FormPanel 简单用法

    Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...

  8. Python-OpenCV 笔记9 -- 模板匹配

    Python-OpenCV 笔记9 – 模板匹配 1.模板匹配:matchTemplate() 函数原型: matchTemplate(image, templ, method[, result[, ...

  9. OPENCV-4 学习笔记

    OPENCV-4 学习笔记 ROI-设定感兴趣的区域(region of interest) 定义: Mat imageROI; //方法一:通过Rect指定矩形区域 imageROI=image(R ...

  10. OpenCV与图像处理学习十六——模板匹配

    OpenCV与图像处理学习十六--模板匹配 一.模板匹配介绍 二.代码应用 一.模板匹配介绍 模板匹配是一种最原始.最基本的模式识别方法,研究某一特定目标的图像位于图像的什么地方,进而对图像进行定位. ...

最新文章

  1. VS2010静态编译生成.exe可执行文件
  2. 验证码画布生成以及点击图片切换验证码
  3. 人眼中亮斑的检测、定位和去除(2)
  4. easyui numberbox一些常用属性,方法
  5. 泰山医学院计算机文化基础,泰医 专 计算机 16级.pdf
  6. Linux的i2c通讯协议
  7. idea运行前端项目
  8. 欧姆龙HOSTLINK协议,上位机软件欧姆龙HOSTLINK协议,适合欧姆龙全系列PLC
  9. YOLO-zht训练-未完待续
  10. 精美UI静态界面欣赏
  11. hdfs 元数据维护机制
  12. linux服务器断电后系统报错,Linux服务器开机启动报错.docx
  13. ZooKeeper audit is enabled. Exiting JVM with code 4
  14. OpenGL超级宝典的例子Triangle
  15. [附源码]java毕业设计哈金院食堂美食评价系统
  16. 用java做小学数学系统_基于jsp的小学数学试卷生成-JavaEE实现小学数学试卷生成 - java项目源码...
  17. 学习记录之OLED显示屏(IIC)1
  18. 【蓝桥杯】算法训练,数字三角形
  19. STEM 教育课程如何设计?
  20. 博弈论——万元陷阱和智猪博弈

热门文章

  1. vue中如何实现换肤?
  2. 怎么将mov格式的视频转换成MP4?
  3. PC分享插件js - sosh.min.js
  4. 抖音小店无货源:为什么现在95后都不想上班,想着去创业?
  5. Data Simulator+DB Fly概述
  6. 1065 单身狗(25 分)
  7. 机器人II_ny_371
  8. 电脑蓝牙已关闭,蓝牙开关不见的故障排除
  9. unity之跳一跳(完整版)
  10. 聚类 k-means、yellowbrick和信用卡用户实例 -- 023