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

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

3天内不再提示

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

OpenCV学堂 来源:OpenCV学堂 2023-12-07 10:56 次阅读

背景概述

OpenCV中自带的模板匹配算法,完全是像素基本的模板匹配,特别容易受到光照影响,光照稍微有所不同,该方法就会歇菜了!搞得很多OpenCV初学者刚学习到该方法时候很开心,一用该方法马上很伤心,悲喜交加,充分感受到了理想与现实的距离,不过没关系,这里介绍一种新的模板匹配算法,主要是基于图像边缘梯度,它对图像光照与像素迁移都有很强的抗干扰能力,据说Halcon的模板匹配就是基于此的加速版本,在工业应用场景中已经得到广泛使用。

算法原理

该算法主要是基于图像梯度,实现基于梯度级别的NCC模板匹配,基于Sobel梯度算子得到dx, dy, magnitude

1b916480-94a8-11ee-939d-92fbcf53809c.jpg

通过Canny算法得到边缘图像、基于轮廓发现得到所有的轮廓点集,基于每个点计算该点的dx、dy、magnitude(dxy)三个值。生成模板信息。然后对输入的图像进行Sobel梯度图像之后,根据模型信息进行匹配,这样的好处有两个:

梯度对光照有很强的抗干扰能力,对模板匹配的抗光照干扰

基于梯度匹配,可以对目标图像上出现的微小像素迁移进行抵消。

1b9cc960-94a8-11ee-939d-92fbcf53809c.jpg

算法实现代码详解

梯度图像计算

Matgx,gy;
Sobel(gray,gx,CV_32F,1,0);
Sobel(gray,gy,CV_32F,0,1);

Matmagnitude,direction;
cartToPolar(gx,gy,magnitude,direction);
longcontoursLength=0;
doublemagnitudeTemp=0;
intoriginx=contours[0][0].x;
intoriginy=contours[0][0].y;

模板生成

//提取dxdymaglog信息
vector>contoursInfo;
//提取相对坐标位置
vector>contoursRelative;

//开始提取
for(inti=0;i< contours.size(); i++) {
    int n = contours[i].size();
    contoursLength += n;
    contoursInfo.push_back(vector(n));
vectorpoints(n);
for(intj=0;j< n; j++) {
        int x = contours[i][j].x;
        int y = contours[i][j].y;
        points[j].x = x - originx;
        points[j].y = y - originy;
        ptin pointInfo;
        pointInfo.DerivativeX = gx.at(y,x);
pointInfo.DerivativeY=gy.at(y,x);
magnitudeTemp=magnitude.at(y,x);
pointInfo.Magnitude=magnitudeTemp;
if(magnitudeTemp!=0)
pointInfo.MagnitudeN=1/magnitudeTemp;
contoursInfo[i][j]=pointInfo;
}
contoursRelative.push_back(points);
}

计算目标图像梯度

//计算目标图像梯度
MatgrayImage;
cvtColor(src,grayImage,COLOR_BGR2GRAY);
Matgradx,grady;
Sobel(grayImage,gradx,CV_32F,1,0);
Sobel(grayImage,grady,CV_32F,0,1);

Matmag,angle;
cartToPolar(gradx,grady,mag,angle);

NCC模板匹配

doublepartialScore=0;
doubleresultScore=0;
intresultX=0;
intresultY=0;
doublestart=(double)getTickCount();
for(introw=0;row< grayImage.rows; row++) {
    for (int col = 0; col < grayImage.cols; col++) {
        double sum = 0;
        long num = 0;
        for (int m = 0; m < contoursRelative.size(); m++) {
            for (int n = 0; n < contoursRelative[m].size(); n++) {
                num += 1;
                int curX = col + contoursRelative[m][n].x;
                int curY = row + contoursRelative[m][n].y;
                if (curX < 0 || curY < 0 || curX >grayImage.cols-1||curY>grayImage.rows-1){
continue;
}

//目标边缘梯度
doublesdx=gradx.at(curY,curX);
doublesdy=grady.at(curY,curX);

//模板边缘梯度
doubletdx=contoursInfo[m][n].DerivativeX;
doubletdy=contoursInfo[m][n].DerivativeY;

//计算匹配
if((sdy!=0||sdx!=0)&&(tdx!=0||tdy!=0))
{
doublenMagnitude=mag.at(curY,curX);
if(nMagnitude!=0)
sum+=(sdx*tdx+sdy*tdy)*contoursInfo[m][n].MagnitudeN/nMagnitude;
}

//任意节点score之和必须大于最小阈值
partialScore=sum/num;
if(partialScore< min((minScore - 1) + (nGreediness * num), nMinScore * num))
                    break;
            }
        }

        // 保存匹配起始点
        if (partialScore >resultScore)
{
resultScore=partialScore;
resultX=col;
resultY=row;
}
}
}

运行效果

正常光照

光照非常暗

改进:

不需要全局匹配,可以对目标图像先做一个小梯度阈值,然后再进行匹配,提升速度、构造目标图像金字塔,实现多分辨率模板匹配支持!

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

    关注

    23

    文章

    4455

    浏览量

    90753
  • 模板
    +关注

    关注

    0

    文章

    106

    浏览量

    20478
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66766
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40774

原文标题:干货 | OpenCV实现边缘模板匹配算法

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

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

    一:什么是模板匹配? 在OpenCV教程中这样解释模板匹配模板
    的头像 发表于 05-05 09:25 3.1w次阅读
    什么是<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><b class='flag-5'>算法</b>

    基于Qualcomm FastCv的边缘检测算法详解

    检测它的边缘。二.算法分类边缘检测法的种类很多,如微分算子法、样板匹配法、小波检测法、神经网络法等等,每一类检测法又有不同的具体方法。目前,微分算子法中有Roberts,Sobel,P
    发表于 09-21 11:45

    openCV边缘检测原理是什么?

    openCV是通过什么原理来实现边缘检测的
    发表于 10-10 06:21

    openCV的库自带了模板匹配算法吗?

    openCV的库自带了模板匹配算法
    发表于 10-10 06:48

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

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

    模板匹配

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

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

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

    基于模板匹配的目标跟踪算法在红外热成像跟踪技术上的应用

    基于模板匹配的目标跟踪算法在红外热成像跟踪技术上的应用
    发表于 02-08 00:57 19次下载

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

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

    融合边缘特征的立体匹配算法Edge-Gray

    为保证SAD算法的立体匹配效率,提高匹配精度,提出一种融合边缘特征的立体匹配算法 Edge-gr
    发表于 04-29 11:06 8次下载
    融合<b class='flag-5'>边缘</b>特征的立体<b class='flag-5'>匹配</b><b class='flag-5'>算法</b>Edge-Gray

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

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

    基于边缘模板匹配适用部分遮挡和光照变化情形(附源码)

    介绍 模板匹配是一个图像处理问题,当其姿态(X,Y,θ)未知时,使用另一张搜索图像中的模板图像找到对象的位置。在本文中,我们实现了一种算法,该算法
    的头像 发表于 10-13 15:20 2819次阅读
    基于<b class='flag-5'>边缘</b>的<b class='flag-5'>模板</b><b class='flag-5'>匹配</b>适用部分遮挡和光照变化情形(附源码)

    opencv如何读取仪表中的指针刻度

    首先说一下模板匹配,它是OpenCV自带的一个算法,可以根据一个模板图到目标图上去寻找对应位置,如果模板
    的头像 发表于 04-13 14:20 983次阅读

    OpenMV如何实现旋转模板匹配

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

    模板匹配算法的改进及在自动发牌机中的应用

    电子发烧友网站提供《模板匹配算法的改进及在自动发牌机中的应用.pdf》资料免费下载
    发表于 11-08 09:53 0次下载
    <b class='flag-5'>模板</b><b class='flag-5'>匹配</b><b class='flag-5'>算法</b>的改进及在自动发牌机中的应用