【OpenCV3】模板匹配——cv::matchTemplate()详解

模板匹配通常被用于目标检测、相似度分析中,opencv2和opencv3中提供了一个专门用于模板匹配的函数——cv::matchTemplate(),下面就对该函数进行详细的介绍。

先从一个实际的例子入手,如下分别是一幅测试图片和一个右眼的模板图片(这里为了方便,是直接从原图上切下来的),通过模板匹配的方法找到测试图片眼睛的位置。

测试代码如下:

#include <opencv2/opencv.hpp>
 
int main()
{
    //加载源图像和模板图像
    cv::Mat image_source = cv::imread("lena.jpg", cv::IMREAD_GRAYSCALE);
    cv::Mat image_template = cv::imread("template.jpg", cv::IMREAD_GRAYSCALE);
 
    cv::Mat image_matched;
 
    //模板匹配
    cv::matchTemplate(image_source, image_template, image_matched, cv::TM_CCOEFF_NORMED);
 
    double minVal, maxVal;
    cv::Point minLoc, maxLoc;
    //寻找最佳匹配位置
    cv::minMaxLoc(image_matched, &minVal, &maxVal, &minLoc, &maxLoc);
 
    cv::Mat image_color;
    cv::cvtColor(image_source, image_color, CV_GRAY2BGR);
    cv::circle(image_color,
               cv::Point(maxLoc.x + image_template.cols/2, maxLoc.y + image_template.rows/2),
               20, 
               cv::Scalar(0, 0, 255), 
               2, 
               8, 
               0);
 
    cv::imshow("source image", image_source);
    cv::imshow("match result", image_matched);
    cv::imshow("target", image_color);
    cv::waitKey(0);
 
    return 0;
}


从测试代码中可以看出cv::matchTemplate()的具体调用方法如下:


    void cv::matchTemplate(
        cv::InputArray image, // 用于搜索的输入图像, 8U 或 32F, 大小 W-H
        cv::InputArray templ, // 用于匹配的模板,和image类型相同, 大小 w-h
        cv::OutputArray result, // 匹配结果图像, 类型 32F, 大小 (W-w+1)-(H-h+1)
        int method // 用于比较的方法
    );


该函数第一个参数是源图像,第二个参数是模板图像,第三个参数是匹配的结果图像,第四个参数是用于指定比较的方法。

下面重点介绍一下第四个参数,opencv中支持的比较方法有六种,分别如下:

1、cv::TM_SQDIFF:该方法使用平方差进行匹配,因此最佳的匹配结果在结果为0处,值越大匹配结果越差。

2、cv::TM_SQDIFF_NORMED:该方法使用归一化的平方差进行匹配,最佳匹配也在结果为0处。

3、cv::TM_CCORR:相关性匹配方法,该方法使用源图像与模板图像的卷积结果进行匹配,因此,最佳匹配位置在值最大处,值越小匹配结果越差。

4、cv::TM_CCORR_NORMED:归一化的相关性匹配方法,与相关性匹配方法类似,最佳匹配位置也是在值最大处。

5、cv::TM_CCOEFF:相关性系数匹配方法,该方法使用源图像与其均值的差、模板与其均值的差二者之间的相关性进行匹配,最佳匹配结果在值等于1处,最差匹配结果在值等于-1处,值等于0直接表示二者不相关。

6、cv::TM_CCOEFF_NORMED:归一化的相关性系数匹配方法,正值表示匹配的结果较好,负值则表示匹配的效果较差,也是值越大,匹配效果也好。

匹配方法的选取根据实际情况而定,这里我们选择的方法是cv::TM_CCOEFF_NORMED,源图像和匹配的相似度图如下:

因此,我们若想找到最佳匹配位置,只需要找到匹配结果图像的最大值点即可,这里我们使用cv::minMaxLoc()函数(具体请参考cv::Mat中最值和均值的求解)来找这个最大值点。找到结果后,将其绘制到原图像上,效果如下图所示(圆等图形的绘制请参考OpenCV3中的绘图详解),这里注意匹配结果图像与原图像之间的大小关系,他们之间差了一个模板大小。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值