点击上方“小白学视觉”,选择“星标”公众号

重磅干货,第一时间送达

经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《从零学习OpenCV 4》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

前面我们通过图像直方图反向投影的方式在图像中寻找模板图像,由于直方图不能直接反应图像的纹理,因此如果两张不同模板图像具有相同的直方图分布特性,那么在同一张图中对这两张模板图像的直方图进行反向投影,最终结果将不具有参考意义。因此,我们在图像中寻找模板图像时,可以直接通过比较图像像素的形式来搜索是否存在相同的内容,这种通过比较像素灰度值来寻找相同内容的方法叫做图像的模板匹配。

模板匹配常用于在一幅图像中寻找特定内容的任务中。由于模板图像的尺寸小于待匹配图像的尺寸,同时又需要比较两张图像中的每一个像素的灰度值,因此常采用在待匹配图像中选择与模板相同尺寸的滑动窗口,通过比较滑动窗口与模板的相似程度,判断待匹配图像中是否含有与模板图像相同的内容,其原理如图4-11所示。

图4-11 模板匹配示意图

在图4-11中,右侧4×4的图像是模板图像,每个像素中的数字是该像素的灰度值,左侧8×8图像是待匹配图像,模板匹配的流程如下:

Step1:在待匹配图像中选取与模板尺寸大小相同的滑动窗口,如图4-11中的阴影区域所示。

Step2:比较滑动窗口中每个像素与模板中对应像素灰度值的关系,计算模板与滑动窗口的相似性。

Step3:将滑动窗口从左上角开始先向右滑动,滑动到最右边后向下滑动一行,从最左侧重新开始滑动,记录每一次移动后计算的模板与滑动窗口的相似性。

Step4:比较所有位置的相似性,选择相似性最大的滑动窗口作为备选匹配结果。

OpenCV 4中提供了用于图像模板匹配的函数matchTemplate(),该函数能够实现模板匹配过程中图像与模板相似性的计算,在代码清单4-12中给出了函数原型。

代码清单4-12 matchTemplate()函数原型1.  void cv::matchTemplate(InputArray image,2.                              InputArray templ,3.                              OutputArray result,4.                              int  method,5.                              InputArray mask = noArray()6.                              )
  • image:待模板匹配的原图像,图像数据类型为CV_8U和CV_32F两者中的一个。

  • templ:模板图像,需要与image具有相同的数据类型,但是尺寸不能大于image。

  • result:模板匹配结果输出图像,图像数据类型为CV_32F。如果image的尺寸为W×H,模板图像尺寸为w×h,则输出图像的尺寸为(W-w+1)×(H-h+1)。

  • method:模板匹配方法标志,可选择参数及含义在表4-3中给出。

  • mask:匹配模板的掩码,必须与模板图像具有相同的数据类型和尺寸,默认情况下不设置,目前仅支持在TM_SQDIFF和TM_CCORR_NORMED这两种匹配方法时使用。

该函数同时支持灰度图像和彩色图像两种图像的模板匹配。函数前两个参数为输入的原图像和模板图像,由于是在原图像中搜索是否存在与模板图像相同的内容,因此需要模板图像的尺寸小于原图像,并且两者必须具有相同的数据类型。第三个参数为相似性矩阵,滑动窗口与模板的相似性系数存放在滑动窗口左上角第一个像素处,因此输出的相似性矩阵尺寸要小于原图像的尺寸,如果image的尺寸为W×H,模板图像尺寸为w×h,则输出图像的尺寸为(W-w+1)×(H-h+1)。因为在模板匹配中原图像不需要进行尺寸的外延,所以滑动窗口左上角可以移动的范围要小于原图像的尺寸。无论输入的是彩色图像还是灰度图像,函数输出结果都是单通道矩阵。了解相似性系数记录的方式便于寻找到与模板最相似的滑动窗口,继而在原图中标记出与模板相同的位置。函数第四个参数是滑动窗口与模板相似性系数的计算方式,OpenCV 4提供了多种计算方法,所有可以选择的标志参数在表4-3中给出,接下来对每一种方法进行详细介绍。

表4-3 matchTemplate()函数模板匹配方法选择标志参数

标志参数

简记

作用

TM_SQDIFF

0

平方差匹配法

TM_SQDIFF_NORMED

1

归一化平方差匹配法

TM_CCORR

2

相关匹配法

TM_CCORR_NORMED

3

归一化相关匹配法

TM_CCOEFF

4

系数匹配法

TM_CCOEFF_NORMED

5

归一化相关系数匹配法

1

01

TM_SQDIFF

该方法名为平方差匹配法,计算的公式如式(6.9)所示,这种方法利用平方差来进行匹配,当模板与滑动窗口完全匹配时计算数值为0,两者匹配度越低计算数值越大。

1

02

TM_SQDIFF_NORMED

该方法名为归一化平方差匹配方法,计算公式如式(6.10)所示,这种方法是将平方差方法进行归一化,使得输入结果缩放到了0到1之间,当模板与滑动窗口完全匹配时计算数值为0,两者匹配度越低计算数值越大。

(6.10)

1

03

TM_CCORR

该方法名为相关匹配法,计算公式如式(6.11)所示,这类方法采用模板和图像间的乘法操作,所以数值越大表示匹配效果越好,0表示最坏的匹配结果。

(6.11)

1

04

TM_CCORR_NORMED

该方法名为归一化相关匹配法,计算公式如式(6.12)所示,这种方法是将相关匹配法进行归一化,使得输入结果缩放到了0到1之间,当模板与滑动窗口完全匹配时计算数值为1,两者完全不匹配时计算结果为0。

(6.12)

1

05

TM_CCOEFF

该方法名为系数匹配法,计算公式如式(6.13)所示,这种方法采用相关匹配方法对模板减去均值的结果和原图像减去均值的结果进行匹配,这种方法可以很好的解决模板图像和原图像之间由于亮度不同而产生的影响。该方法中模板与滑动窗口匹配度越高计算数值越大,匹配度越低计算数值越小,并且该方法计算结果可以为负数。

(6.13)

其中:

(6.14)

1

05

TM_CCOEFF_NORMED

该方法名为归一化系数匹配法,计算公式如式(6.15)所示,这种方法将系数匹配方法进行归一化,使得输入结果缩放到了1到-1之间,当模板与滑动窗口完全匹配时计算数值为1,当两者完全不匹配时计算结果为-1。

(6.15)

了解不同的计算相似性方法时,重点需要知道在每种方法中最佳匹配结果的数值应该是较大值还是较小值,由于matchTemplate()函数的输出结果是存有相关性系数的矩阵,因此需要通过minMaxLoc()函数去寻找输入矩阵中的最大值或者最小值,进而确定模板匹配的结果。

通过寻找输出矩阵的最大值或者最小值得到的只是一个像素点,需要以该像素点为矩形区域的左上角,绘制与模板图像同尺寸的矩形框,标记出最终匹配的结果。为了了解图像模板匹配相关函数的使用方法,在代码清单4-13中给出了在彩色图像中进行模板匹配的示例程序。程序中采用TM_CCOEFF_NORMED方法计算相关性系数,通过minMaxLoc()函数寻找相关性系数中的最大值,确定最佳匹配值的像素点坐标,之后在原图中绘制出与模板最佳匹配区域的范围,程序的运行结果在图4-12中给出。

代码清单4-13 myMatchTemplate.cpp图像的模板匹配1.  #include 2.  #include 3.  4.  using namespace cv;5.  using namespace std;6.  7.  int main()8. {9.    Mat img = imread("lena.png");10.    Mat temp = imread("lena_face.png");11.    if (img.empty() || temp.empty())12.    {13.      cout << "请确认图像文件名称是否正确" << endl;14.      return -1;15.    }16.    Mat result;17.    matchTemplate(img, temp, result, TM_CCOEFF_NORMED);//模板匹配18.    double maxVal, minVal;19.    Point minLoc, maxLoc;20.    //寻找匹配结果中的最大值和最小值以及坐标位置21.    minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);22.    //绘制最佳匹配区域23.    rectangle(img,cv::Rect(maxLoc.x,maxLoc.y,temp.cols,temp.rows),Scalar(0,0,255),2);24.    imshow("原图", img);25.    imshow("模板图像", temp);26.    imshow("result", result);27.    waitKey(0);28.    return 0;29.  }

图4-12 myMatchTemplate.cpp程序运行结果

从零学习OpenCV 4往期推荐

【从零学习OpenCV 4】Windows系统中安装OpenCV 4

【从零学习OpenCV 4】Ubuntu系统中安装OpenCV 4

【从零学习OpenCV 4】opencv_contrib扩展模块的安装

【从零学习OpenCV 4】Mat类介绍

【从零学习OpenCV 4】Mat类构造与赋值

【从零学习OpenCV 4】Mat类支持的运算

【从零学习OpenCV 4】这4种读取Mat类元素的的方法你都知道么?

【从零学习OpenCV 4】namedWindow函数&imshow函数的使用

【从零学习OpenCV 4】颜色模型与转换

【从零学习OpenCV 4】多通道分离与合并

【从零学习OpenCV 4】图像像素统计

【从零学习OpenCV 4】两图像间的像素操作

【从零学习OpenCV 4】图像二值化

【从零学习OpenCV 4】LUT查找表

【从零学习OpenCV 4】图像仿射变换

【从零学习OpenCV 4】图像透视变换

【从零学习OpenCV 4】极坐标变换

【从零学习OpenCV 4】绘制几何图形

【从零学习OpenCV 4】图像金字塔

【从零学习OpenCV 4】创建图像窗口滑动条

【从零学习OpenCV 4】鼠标响应

【从零学习OpenCV 4】图像直方图绘制

【从零学习OpenCV 4】直方图归一化

【从零学习OpenCV 4】直方图比较

【从零学习OpenCV 4】直方图均衡化

【从零学习OpenCV 4】直方图匹配

……

经过几个月的努力,市面上第一本OpenCV 4入门书籍《从零学习OpenCV 4》将于今年12月左右由人民邮电出版社发行。如果小伙伴觉得内容有帮助,希望到时候多多支持!

关注小白的小伙伴可以提前看到书中的内容,我们创建了学习交流群,欢迎各位小伙伴添加小白微信加入交流群,添加小白时请备注“学习OpenCV 4”。

opencv4 图像特征匹配_【从零学习OpenCV 4】图像模板匹配相关推荐

  1. python编辑距离正则匹配_(C/C++学习)33.编辑距离和正则表达式匹配分析

    说明:本文主要分析关于力扣 10 题(正则表达式匹配) 和 力扣 72 题(编辑距离) 的状态方程问题(主要便于自己理解) 1.关于编辑距离的状态方程: a. 首先 DP[i][j] 为字符串 1 的 ...

  2. opencv4 c++ 提取图片中的白色区域_修正!【从零学习OpenCV 4】分割图像——分水岭法...

    点击上方"小白学视觉",选择"星标"公众号重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开 ...

  3. cv2.error: opencv(4.4.0)_【从零学习OpenCV 4】图像金字塔

    点击上方"小白学视觉",选择"星标"公众号 重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习Open ...

  4. opencv利用矩形框选中某一区域_【从零学习OpenCV】4Ubuntu系统中安装OpenCV 4

    经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分 ...

  5. 快速系统从零学习OpenCV 4路线图

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 转眼间,小白学视觉就要成立三周年了,小白一直是很感谢小伙伴们的支持 ...

  6. 【从零学习OpenCV 4】了解OpenCV的模块架构

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...

  7. 【从零学习openCV】IOS7下的人脸检測

    前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app,总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...

  8. 【从零学习openCV】IOS7下的人脸检测

    前言: 人脸检测与识别一直是计算机视觉领域一大热门研究方向,而且也从安全监控等工业级的应用扩展到了手机移动端的app,总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,目前在学习ope ...

  9. 【从零学习openCV】IOS7根据人脸检测

    前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app.总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...

  10. 【从零学习OpenCV 4】4种读取Mat类元素的的方法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...

最新文章

  1. 汇编语言使用C库函数和Linux动态链接
  2. 电商企业为什么要搞中台?
  3. Design Pattern - Abstract Factory(C#)
  4. C语言实现队列ADT(Queue ADT)接口COMP2521(附完整源码)
  5. C. 防止E-mail注入
  6. qt做的接收串口数据并显示曲线_QT无人机地面站设计与制作
  7. 霍金竟然亲口承认自己是个赌徒!明明失败了不止一次,“菜鸡”却成了神话!...
  8. 取值方法_「EV3进阶课」制作小游戏:数据取值体系要统一(三)
  9. 简述计算机控制系统调试和运行的过程,简述计算机控制系统的一般控制过程
  10. AJAX JSON之讲解
  11. KeilC51使用教程
  12. 帆软报表Tomcat 发布部署
  13. 自主招生计算机网测,自主招生考试中,笔试和机试有什么区别?
  14. 怎么更改自己IP地址 切换电脑本机IP软软件哪个好用
  15. Php将mp3转wav,mp3转换成wav的经验方法
  16. 澳洲留学生面经,Java后端,阿里、头条、百度、华为、微策略
  17. XCode11上传ipa到AppStoreConnect
  18. iOS中Keychain保存用户名和密码
  19. 骑士旅行问题(骑士走棋盘)
  20. 全国工程师薪资统计:平均 14 k,算法岗遥遥领先

热门文章

  1. Java 多线程(一)并发、并行、线程、多线程、进程
  2. Flutter 技术介绍
  3. Flutter学习 — 从新页面返回数据给上一个页面
  4. Android ToggleButton(状态切换按钮)
  5. python与中文的那点事
  6. python中sys.argv[]的使用
  7. $SVN代码版本管理工具的使用
  8. NSURLConnection实现断点续传
  9. 对 Lotus Notes 邮件模版进行二次开发的最佳实践
  10. web安全day10:通过实验理解windows域的OU和GPO