0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

​详细剖析模板匹配

新机器视觉 来源:小白学视觉 2023-03-03 10:10 次阅读


																

模板匹配介绍

我们需要2幅图像:

原图像 (I):在这幅图像里,我们希望找到一块和模板匹配的区域

模板 (T):将和原图像比照的图像块

c3b0917c-b920-11ed-bfe3-dac502259ad0.jpg

  • 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。

  • 所以模板匹配首先需要一个模板图像T(给定的子图像)

  • 另外需要一个待检测的图像-源图像S

  • 工作方法,在带检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。

模板匹配原理

我们的目标是检测最匹配模板的原图像的区域:

c3cf2614-b920-11ed-bfe3-dac502259ad0.jpg

为了确定匹配模板区域, 我们不得不滑动模板图像和原图像进行比较 :

c3ed1386-b920-11ed-bfe3-dac502259ad0.jpg

对于 模板(T) 覆盖在 原图像 (I) 上的每个位置,你把度量值保存 到 结果图像矩阵 ( R ) 中. 在 R 中的每个位置 (x,y) 都包含匹配度量值:

c40a2bd8-b920-11ed-bfe3-dac502259ad0.jpg

上图(右)就是TM_CCORR_NORMED方法处理后的结果图像 R . 最白的位置代表最高的匹配. 正如您所见, 黑色框住的位置很可能是结果图像矩阵中的最大数值, 所以这个区域 (以这个点为顶点,长宽和模板图像一样大小的矩阵) 被认为是匹配的.

实际上, 我们使用函数minMaxLoc来定位在矩阵 R 中的最大值点 (或者最小值, 根据函数输入的匹配参数) .

voidminMaxLoc(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

c41a139a-b920-11ed-bfe3-dac502259ad0.png

  • 计算相关性:计算出来的值越大,越相关TM_CCORR = 2

c42bcae0-b920-11ed-bfe3-dac502259ad0.png

  • 计算相关系数:计算出来的值越大,越相关TM_CCOEFF = 4

c43c1ac6-b920-11ed-bfe3-dac502259ad0.png

  • 计算归一化平方不同 :计算出来的值越接近0,越相关TM_SQDIFF_NORMED = 1

c44f3d22-b920-11ed-bfe3-dac502259ad0.png

  • 计算归一化相关性:计算出来的值越接近1,越相关TM_CCORR_NORMED = 3

c460754c-b920-11ed-bfe3-dac502259ad0.png

  • 计算归一化相关系数:计算出来的值越接近1,越相关TM_CCOEFF_NORMED = 5

c471e37c-b920-11ed-bfe3-dac502259ad0.png

总结如下:

c480914c-b920-11ed-bfe3-dac502259ad0.jpg

相关API介绍cv::matchTemplate

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

c49aaca8-b920-11ed-bfe3-dac502259ad0.jpg

程序代码

#include
#include
usingnamespacestd;
usingnamespacecv;

// 定义一些全局变量, 例如原图像(img), 模板图像(templ) 和结果图像(result) ,
// 还有匹配方法以及窗口名称:
Mat img, templ, result;
char* image_window ="Source Image";
char* result_window ="Result window";

intmatch_method = TM_SQDIFF;
intmax_Trackbar =5;

voidMatchingMethod(int,void* );

intmain(intargc,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);
return0;
}

voidMatchingMethod(int,void* )
{
// 将被显示的原图像
Mat img_display;
img.copyTo( img_display );

// 创建输出结果的矩阵
intresult_cols = img.cols - templ.cols +1;
intresult_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 定位最匹配的位置
doubleminVal, 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;
}

运行结果

c4aa700c-b920-11ed-bfe3-dac502259ad0.jpg

c4bdc79c-b920-11ed-bfe3-dac502259ad0.jpg

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像
    +关注

    关注

    2

    文章

    1084

    浏览量

    40455
  • 模板
    +关注

    关注

    0

    文章

    108

    浏览量

    20561
  • 函数
    +关注

    关注

    3

    文章

    4329

    浏览量

    62576

原文标题:​详细剖析模板匹配

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么是模板匹配模板匹配的原理讲解 图像处理与模板匹配算法

    一:什么是模板匹配? 在OpenCV教程中这样解释模板匹配模板匹配是一项在一幅图像中寻找与另
    的头像 发表于 05-05 09:25 3.4w次阅读
    什么是<b class='flag-5'>模板</b><b class='flag-5'>匹配</b>?<b class='flag-5'>模板</b><b class='flag-5'>匹配</b>的原理讲解 图像处理与<b class='flag-5'>模板</b><b class='flag-5'>匹配</b>算法

    labview 模板匹配

    请问模板匹配没有数据出现是什么问题?
    发表于 04-10 15:29

    labview 视觉 多模板匹配 教程

    ` 本帖最后由 wcl86 于 2019-9-24 17:12 编辑 Labview视觉多模板匹配教程 源码回复可见:[hide][/hide]谈到labview的定位,有很多人吐槽其没有多模板
    发表于 09-24 16:59

    labview 视觉 多模板匹配 教程

    `谈到labview的定位,有很多人吐槽其没有多模板匹配的功能,今天就给大家介绍下,labview视觉自带的多模板匹配功能。多模板
    发表于 07-23 20:46

    手写数字识别的模板匹配方法源程序

    手写数字识别的模板匹配
    发表于 01-02 19:43 73次下载

    基于改进模板匹配的芯片缺陷检测方法

    提出了一种改进的模板匹配方法。该方法是在传统的模板匹配方法的基础上,通过对模板匹配算法的改进,以
    发表于 09-03 15:15 9次下载

    基于模板匹配的电子元器件针脚检测方法

    相关系数法模板匹配是数字摄影检测中的一种经典的基于灰度的匹配方法。提出了一种基于模板匹配的电子器件针脚检测方法,以实际针脚影像和自动生成的标
    发表于 08-02 14:12 19次下载

    基于模板匹配的图像跟踪技术

    为了解决传统模板匹配方法跟踪图像时遇到的问题,提出了在跟踪过程中采用变模板匹配的方法。该方法较好地解决了传统方法的局限性,通过实验比较了使用模板
    发表于 12-20 17:01 0次下载

    模板匹配

    《OpenCV3编程入门》书本配套源代码:模板匹配
    发表于 06-06 15:39 5次下载

    OpenCV3编程入门-源码例程全集-模板匹配

    OpenCV3编程入门-源码例程全集-模板匹配
    发表于 09-17 22:55 4次下载

    基于模板匹配的OCR盲人导读仪器(STM32+OV5640)

    基于模板匹配的OCR盲人导读仪器(STM32F407+OV5640)
    发表于 12-11 16:39 35次下载

    机器视觉中基于灰度统计的快速模板匹配算法详细概述

    本文针对传统的基于灰度值的匹配算法计算量大、时间复杂度高的缺陷,提出了一种基于灰度统计的快速模板匹配算法。以十字特征直线代替模板进行粗匹配
    发表于 08-18 15:53 7次下载
    机器视觉中基于灰度统计的快速<b class='flag-5'>模板</b><b class='flag-5'>匹配</b>算法<b class='flag-5'>详细</b>概述

    探究halcon模板匹配干扰边缘消除办法

    最近做了个项目,遇到一个问题,就是在创建形状匹配模板时候,干扰太多,像麻绳一样。 使用自定义区域去消除吧,因为轮廓长,边缘干扰距离近,操作起来不方便; 使用CAD图形创建模板吧,又因为产品随意性比较
    的头像 发表于 05-29 13:42 4781次阅读

    OpenMV如何实现旋转模板匹配

    OpenCV中模板匹配不支持旋转角度、不支持多尺度跟多对象模板匹配,同时匹配速度比较慢,针对不支持旋转
    的头像 发表于 01-14 10:21 1880次阅读

    OpenCV边缘模板匹配算法原理详解

    OpenCV中自带的模板匹配算法,完全是像素基本的模板匹配,特别容易受到光照影响,光照稍微有所不同,该方法就会歇菜了!搞得很多OpenCV初学者刚学习到该方法时候很开心,一用该方法马上
    的头像 发表于 12-07 10:56 1388次阅读
    OpenCV边缘<b class='flag-5'>模板</b><b class='flag-5'>匹配</b>算法原理详解