模板匹配介绍

我们需要2幅图像:

  • 原图像 (I): 在这幅图像里,我们希望找到一块和模板匹配的区域
  • 模板 (T): 将和原图像比照的图像块
  • 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。
  • 所以模板匹配首先需要一个模板图像T(给定的子图像)
  • 另外需要一个待检测的图像-源图像S
  • 工作方法,在带检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。

模板匹配原理

  • 我们的目标是检测最匹配模板的原图像的区域:
  • 为了确定匹配模板区域, 我们不得不滑动模板图像和原图像进行比较 :
  • 对于 模板(T) 覆盖在 原图像 (I) 上的每个位置,你把度量值保存 到 结果图像矩阵 ( R ) 中. 在 R 中的每个位置 (x,y) 都包含匹配度量值:
  • 上图(右)就是 TM_CCORR_NORMED 方法处理后的结果图像 R . 最白的位置代表最高的匹配. 正如您所见, 黑色框住的位置很可能是结果图像矩阵中的最大数值, 所以这个区域 (以这个点为顶点,长宽和模板图像一样大小的矩阵) 被认为是匹配的.
  • 实际上, 我们使用函数 minMaxLoc 来定位在矩阵 R 中的最大值点 (或者最小值, 根据函数输入的匹配参数) .

void minMaxLoc(InputArray src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray())
src:输入图像。
minVal:在矩阵 src中存储的最小值,可输入NULL表示不需要。
maxVal :在矩阵 src中存储的最大值,可输入NULL表示不需要。
minLoc:在结果矩阵中最小值的坐标,可输入NULL表示不需要,Point类型。
maxLoc:在结果矩阵中最大值的坐标,可输入NULL表示不需要,Point类型。
mask:可选的掩模

模板匹配介绍 – 匹配算法介绍

OpenCV中提供了六种常见的匹配算法如下:

  • 计算平方不同 : 计算出来的值越小,越相关 TM_SQDIFF = 0
  • 计算相关性: 计算出来的值越大,越相关 TM_CCORR = 2
  • 计算相关系数: 计算出来的值越大,越相关 TM_CCOEFF = 4
  • 计算归一化平方不同 : 计算出来的值越接近0,越相关 TM_SQDIFF_NORMED = 1
  • 计算归一化相关性: 计算出来的值越接近1,越相关 TM_CCORR_NORMED = 3
  • 计算归一化相关系数: 计算出来的值越接近1,越相关 TM_CCOEFF_NORMED = 5

相关API介绍cv::matchTemplate

matchTemplate(
InputArray image,// 源图像,必须是8-bit或者32-bit浮点数图像
InputArray templ,// 模板图像,类型与输入图像一致
OutputArray result,// 输出结果,必须是单通道32位浮点数,假设源图像WxH,模板图像wxh, 则结果必须为W-w+1, H-h+1的大小。
int method,//使用的匹配方法
InputArray mask=noArray()//(optional)
)

程序代码

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;// 定义一些全局变量, 例如原图像(img), 模板图像(templ) 和结果图像(result) ,
// 还有匹配方法以及窗口名称:
Mat img, templ, result;
char* image_window = "Source Image";
char* result_window = "Result window";int match_method = TM_SQDIFF;
int max_Trackbar = 5;void MatchingMethod( int, void* );int main( int argc, char** argv )
{// 1. 载入原图像和模板块img = imread("E:/Experiment/OpenCV/Pictures/TargetSearch.jpg");templ = imread("E:/Experiment/OpenCV/Pictures/Target.jpg");imshow("模板图像",templ);// 创建窗口namedWindow( image_window, CV_WINDOW_AUTOSIZE );namedWindow( result_window, CV_WINDOW_AUTOSIZE );// 2. 创建滑动条并输入将被使用的匹配方法. 一旦滑动条发生改变,回调函数 MatchingMethod 就会被调用.char* trackbar_label = "模板匹配方式";createTrackbar( trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod );MatchingMethod( 0, 0 );waitKey(0);return 0;
}void MatchingMethod( int, void* )
{// 将被显示的原图像Mat img_display;img.copyTo( img_display );// 创建输出结果的矩阵int result_cols =  img.cols - templ.cols + 1;int result_rows = img.rows - templ.rows + 1;// 创建了一幅用来存放匹配结果的输出图像矩阵. 仔细看看输出矩阵的大小(它包含了所有可能的匹配位置)result.create( result_cols, result_rows, CV_32FC1 );// 执行模板匹配操作,并对结果进行归一化:matchTemplate( img, templ, result, match_method );normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );// 通过函数 minMaxLoc 定位最匹配的位置double minVal, maxVal; Point minLoc, maxLoc;Point matchLoc;//通过使用函数 minMaxLoc ,我们确定结果矩阵 R 的最大值和最小值的位置.minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );//寻找result中最大值,最小值,及它们所在的位置// 对于方法 SQDIFF 和 SQDIFF_NORMED, 越小的数值代表更高的匹配结果. 而对于其他方法, 数值越大匹配越好if( match_method  == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED ){ matchLoc = minLoc; }else{ matchLoc = maxLoc; }// 绘制矩形rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );imshow( image_window, img_display );imshow( result_window, result );return;
}

运行结果


参考博客

  1. https://blog.csdn.net/LYKymy/article/details/83210432 (我觉得他写的比我好,推荐阅读)
  2. https://blog.csdn.net/huanghuangjin/article/details/81180568

OpenCV-图像处理(27、模板匹配(Template Match))相关推荐

  1. OpenCV中的图像处理 —— 傅里叶变换+模板匹配

    OpenCV中的图像处理 -- 傅里叶变换+模板匹配 现在也在逐渐深入啦,希望跟大家一起进步越来越强 目录 OpenCV中的图像处理 -- 傅里叶变换+模板匹配 1. 傅里叶变换 1.1 Numpy实 ...

  2. OpenCV模板匹配Template Matching

    OpenCV模板匹配Template Matching 模板匹配Template Matching 目标 理论 什么是模板匹配? OpenCV提供哪些匹配方法? 代码 解释 结果 模板匹配Templa ...

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

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

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

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

  5. OpenCV中的模板匹配

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

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

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

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

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

  8. OpenCV+python:模板匹配

    1,模板匹配的概念及原理 模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术. 我们需要2幅图像: 模板 (T): 将和原图像比照的图像块 原图像 (I): 在这幅图像里,我们希望 ...

  9. opencv 有无判断 模板匹配_opencv模板匹配

    模板匹配在图像处理中经常使用,该算法主要用于寻找图像中与模板图像相同的区域.此外,也用于图像定位,通过模板匹配找到指定的位置,然后进行后续的处理. 在进行模板匹配的时候,需要先制作模板,模板图像一般是 ...

  10. opencv基础--图像模板匹配

    参考:https://blog.csdn.net/ivanhawking/article/details/83182692(该链接附载链接有处理多目标,旋转,缩放等匹配的方法) 1.概述 图像匹配是指 ...

最新文章

  1. SilverLight学习笔记--Silverlight中WebRequest通讯
  2. 2019年首期“医工结合科研创新支持计划”项目申报获批:医工携手 强校强国...
  3. Java基础语法(数组)
  4. iOS关于RunLoop和Timer
  5. 继承之接口知识点和思考练习
  6. mysql存储过程捕获错误处理_mysql存储过程之异常处理篇
  7. oracle数据库无法查询,关于oracle中无法查询中文条件的解决办法
  8. java ee jsp程序_JavaEE程序设计及项目开发教程(JSP篇)
  9. 2020-09-24L1-016 查验身份证 (15分) 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,
  10. WAFW00F、WebCrack
  11. 三. 英语语法 - 名词和名词性从句
  12. 病毒分析 - 特征码提取
  13. 6.4 置换基本概念
  14. 二十一世纪大学英语读写教程学习笔记(原文)——2 - Conversational Ballgames(对话风格与球类运动)
  15. 《炬丰科技-半导体工艺》多层薄膜封装工艺
  16. Oracle 10g For Windows 10.1.0和 Oracle 10g For Linux 10.1.0.3下载地址
  17. Linux:Centos7升级内核
  18. 【Echarts】设置主题、扇形格式化
  19. 中小企业RBM结合VRRP组网
  20. [转载]Python兵器谱

热门文章

  1. Bash之正则表达式
  2. kali linux Python开发环境初始化
  3. Simple-RTMP-Server 服务器搭建
  4. JSTL不同版本和EL表达式的关联
  5. Jquery常用开发插件收集
  6. 2、两数相加(python)
  7. Linux 如何打开pyo文件,Python的文件类型
  8. php paypal ipn返回验证,Paypal IPN检测退款,PHP
  9. synchronized互斥锁结合wait()、notify()方法使用,实现线程的阻塞以及线程调用案例
  10. python布局管理_Python入门-图形用户界面-几何布局管理器-grid布局管理器