openCV实现模板匹配

在图像目标识别技术的研究应用中,模板匹配技术是其中一个重要的研究方向,它具有算法简单、计算量小以及识别率高的特点。模板匹配的基本原理是通过相关函数的计算来找到它和被搜索图的坐标位置。比如可以设模板 T ( n×m像素点)叠放在搜索图S上平移,模板覆盖下的那块搜索图叫做子图, i , j 为这块子图的左上角像点在S图中的坐标 , 叫参考点 , 1≤ i , j ≤n -m+ 1。比较T和Si , j的内容,若两者一致 , 则 T 和 Si , j之差为零。

这里写图片描述
针对图像特征不同 , 有多种匹配算法 。例如 : 绝对差算法,是一种简化了的 求解相 似度的 方法 , 计算量 小 , 当目标图像变化不是很快的情况下 , 具有一 定的实用性 ; 不变矩策略主要应用于一些简单图形的识别 , 具有大小旋转不变性 ,但对于有形状变化的图 像识别 不太适 合 ; 傅 立叶变 换或小波变换 , 将图像变换到变换域 , 与目标图像变换域特征进行比较得到相似程度 , 其匹配 准确度 高 、 抗干扰能力强 , 但计算量大。基于各种匹配算法的优点 , 它们已被应用于从简单图形 ( 背 景 、汽车、飞机等) 到复杂图像 (字符、指纹、人脸等)的识别、目标跟踪等众多领域 。
openCV的C++版提供了模板匹配的函数:
void matchTemplate(InputArray image, InputArray temp, OutputArray result, int method)
image –需要进行模板匹配的原图像(搜索图)。
templ –模板图像,不能够比原图像小并且需要和原图有相同的格式。
result – 匹配窗口,如果原图(image)尺寸是W×H,模板(templ)是w×h,则匹配窗口(result)的尺寸是(W-w+1)×(H-h+1)
method – 指定使用何种匹配方法的参数
method对应的匹配方法:
这里写图片描述
当函数完成匹配后,使用minMaxLoc()函数就可以找到做为全局最大(CV_TM_SQDIFF)或最小(CV_TM_CCORR)值的最佳匹配结果。
下面通过一个例子来实现模板匹配:

#define WN  "模板匹配"
Mat srcImg, tempImg, resultImg;
int MatchMetod;
int MaxTrackbarNum = 5;
void Matching(int, void*);

void matchTemplateFunction(){
    srcImg = imread("Tekkaman.jpg");
    tempImg = imread("headTan.png");
    createTrackbar("方法", WN, &MatchMetod, MaxTrackbarNum, Matching);
    Matching(0, 0);
    waitKey(0);
}
void Matching(int, void*){
    //给局部变量初始化
    Mat copyImg;
    srcImg.copyTo(copyImg);
    //初始化用于结果输出的矩阵
    int resultImgCols = srcImg.cols - tempImg.cols + 1;
    int resultImgRows = srcImg.rows - tempImg.rows + 1;
    resultImg.create(resultImgCols, resultImgRows, CV_32FC1);
    //进行匹配和标准化
    matchTemplate(copyImg, tempImg, resultImg, MatchMetod);
    normalize(resultImg, resultImg, 0, 1, NORM_MINMAX, -1, Mat());
    //通过函数minMaxLoc定位最匹配位置
    double minValue, maxValue;
    Point minLocation, maxLocation,matchLocation;
    minMaxLoc(resultImg, &minValue, &maxValue, &minLocation, &maxLocation, Mat());
    //对于方法SQDIFF和SQDIFF_NORMED,越小的数值有着更高的匹配结果,而其余方法,数组越大匹配效果越好
    if (MatchMetod == CV_TM_SQDIFF || MatchMetod == CV_TM_SQDIFF_NORMED){
        matchLocation = minLocation;
    }
    else{ matchLocation = maxLocation; }
    //绘制出矩形,并显示最终结果
    rectangle(srcImg, matchLocation, Point(matchLocation.x + tempImg.cols, matchLocation.y + tempImg.rows)
        ,Scalar(0,0,255),2,8,0);
    rectangle(resultImg, matchLocation, Point(matchLocation.x + tempImg.cols, matchLocation.y + tempImg.rows), Scalar(0, 0, 255), 2, 8, 0);

    imshow(WN,srcImg);
    //imshow("效果图", resultImg);

}

int main(){ 
    matchTemplateFunction();
    return 0;
}

原图:
这里写图片描述
模板图:
这里写图片描述
匹配结果:
这里写图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值