模板匹配的概念与原理

模板匹配是在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术,在OpenCV中,模板匹配由函数MatchTemplate()函数实现。需要注意的是,模板匹配不是基于直方图的,而是通过在输入图像上滑动图像块,对实际的图像块和输入图像进行匹配的一种方法。

如图,通过一个人脸图像模板,在整个输入图像上移动这张脸,寻找和这张脸相似的最优匹配。

MatchTemplate()函数

MatchTemplate()用于匹配出和模板重叠的图像区域,函数原型:

void MatchTemplate(InputArray image, InputArray telp1, outputArray result, int method)
  • 第一个参数:待搜索的图像,需要是8位或32位浮点型图像。
  • 第二个参数:搜索模板,需要和源图像有一样的数据类型,且尺寸不能大于源图像。
  • 第三个参数:比较结果的映射图像,必须是单通道32位浮点型图像。如果图像尺寸是W*H,temp1是w*h,则此参数一定是(W-w+1)*(H-h+1).
  • 第四个参数:int类型的method,指定的匹配方法,有6种方法可以使用:

1、平方差匹配法method=TM_SQDIFF

这类方法是用平方差来匹配,最好匹配为0,匹配越差,则匹配值越大。

2、归一化平方差匹配法method=TM_SQDIFF_NORMED

3、相关匹配法method=TM_CCORR

这类方法采用模板和图像件的乘法操作,所以较大的数表示匹配程度较高,0表示最坏的匹配结果。

4、归一化相关匹配法method=TM_CCORR_NORMED

5、系数匹配法method=RM_CCOEFF

这类方法将模板对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示较差的匹配。0表示没有任何相关性。

其中:

6、归一化系数匹配法method=RM_CCOEFF_NORMED

通常,从简单的测量(平方差)到更复杂的测量(相关系数),我们可获得越来越准确的匹配,但同时也会以越来越大的计算量为代价。

代码示例:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>using namespace std;
using namespace cv;int main() {Mat g_srcImage, g_templateImage, g_resultImage;int g_nMatchMethod = 1;g_srcImage = imread("/Users/dwz/Desktop/cpp/person.jpg", 1);g_templateImage = imread("/Users/dwz/Desktop/cpp/face.jpg", 1);Mat srcImage;g_srcImage.copyTo(srcImage);int resultImage_cols, resultImage_rows;resultImage_cols = g_srcImage.cols - g_templateImage.cols +1;resultImage_rows = g_srcImage.rows - g_templateImage.rows +1;g_resultImage.create(resultImage_cols, resultImage_rows, CV_32FC1);matchTemplate(g_srcImage, g_templateImage, g_resultImage, g_nMatchMethod);normalize(g_resultImage, g_resultImage, 0, 1, NORM_MINMAX, -1, Mat());double minValue;double maxValue;Point minLocation;Point maxLocation;Point matchLocation;minMaxLoc(g_resultImage, &minValue, &maxValue, &minLocation, &maxLocation, Mat());matchLocation = minLocation;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);imwrite("result.jpg", g_resultImage*255);imwrite("result_src.jpg", srcImage);return 0;
}

输入:

输出:

OpenCV之模板匹配相关推荐

  1. Opencv java模板匹配-角点检测(11)

    函数 在opencv中有模板匹配的方法, Imgproc.matchTemplate(src, template, result, Imgproc.TM_CCOEFF); 这个方法输入的参数分别是: ...

  2. Python+OpenCV:模板匹配(Template Matching)

    Python+OpenCV:模板匹配(Template Matching) Template Matching with Single Objects ######################## ...

  3. OpenCV—python 模板匹配与图像特征匹配

    文章目录 一.理论介绍与算法 二.算法代码 单目标匹配 多目标匹配 三 多尺度模板匹配 一.理论介绍与算法 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个 ...

  4. 基于VS与OpenCV的模板匹配学习(4):手写OpenCV matchTemplate()

    基于VS与OpenCV的模板匹配学习(4):手写OpenCV matchTemplate() 文章目录 基于VS与OpenCV的模板匹配学习(4):手写OpenCV matchTemplate() 前 ...

  5. OpenCV:模板匹配

    小程序「跳一跳」的自动化. 主要涉及到了OpenCV的模板匹配和边缘检测技术,以及Android开发调试工具ADB. 如果放在一起说,感觉内容有些多. 所以,分三期来讲,也能多了解一些东西. 首先介绍 ...

  6. Python+Opencv实现模板匹配

    目录 一.模板匹配简介 二.传统模板匹配算法不足之处 三.多尺度模板匹配实现步骤 四.多尺度模板匹配实现代码 五.多尺度模板匹配效果展示和分析 六.思维扩展 参考资料 注意事项 一.模板匹配简介    ...

  7. 基于opencv的模板匹配详解

    1.什么是模板匹配 在OpenCV教程中这样解释模板匹配: 模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术.这里说的模板是我们已知的小图像,模板匹配就是在一副大图像中搜寻目标. ...

  8. opencv 多角度模板匹配

    总结一下实现多角度模板匹配踩的坑 一 .多角度匹配涉及到要使用mask,首先opencv matchTemplateMask自带的源码如下: static void matchTemplateMask ...

  9. Opencv(六)模板匹配、轮廓检测、轮廓周围绘制矩形框和圆形框

    模板匹配介绍 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域. 所以模板匹配首先需要一个模板图像T(给定的子图像) 另外需要一个待检测的图像-源图像S 工作方法,在带检测图像上,从左到右,从 ...

  10. [图像识别]8.OpenCV的模板匹配和霍夫检测

    回顾,上节课你学了什么?  Sobel_x_or_y=cv.Sobel(img,ddepth,dx,dy,dst,ksize,scale,delta,borderType) 常用 Sobel_x_or ...

最新文章

  1. windows下硬盘安装mint10
  2. Java synchronized 中的 while 和 notifyAll
  3. npm WARN enoent ENOENT: no such file or directory
  4. 移动端网页特效:左右滑动开关
  5. 大话数据结构 : 二叉排序树
  6. (私人收藏)python学习(游戏、爬虫、排序、练习题、错误总结)
  7. java宋江,Java编程内功-数据结构与算法「单链表」,
  8. java调用cmd_Java调用CMD命令
  9. spss入门——简单的数据预处理到时间序列分析系列(五)
  10. 2007年个人回忆与总结
  11. Log4j使用配置总结
  12. 服务号、订阅号、小程序、企业号(企业微信)的认知与区别
  13. 已解决SyntaxError:expected ‘:‘
  14. Java数据结构与算法——链表
  15. Scratch少儿编程案例-植物大战僵尸完整版
  16. 应用商店审核指南(中文版)
  17. 机票预订系统需求分析报告
  18. 上海城市发展集团借力泛微文书定,实现标准化、数字化的档案管理
  19. arrow function
  20. 基于模糊控制技术的汽车空调半导体制冷片送风控制系统研究

热门文章

  1. WGS84坐标系转换到J2000坐标系
  2. 第十一届 蓝桥杯 省 模拟赛 试题+题解 C/C++描述
  3. wget 命令的使用:HTTP文件下载、FTP文件下载
  4. prince2 成功的项目管理_我的PRINCE2故事
  5. win7录屏_原来电脑自带的录屏功能,那么好用,可惜很多人还不知道,真遗憾...
  6. 【Axure原型】新闻资讯客户端APP原型 今日头条同类APP实战原型
  7. 迈达斯导出html计算书,动态计算书模块功能-midas Civil 2011
  8. 日志查看工具 logviewer pro的使用
  9. node的学习过程(菜鸟)
  10. Android Studio创建AVD教程