Opencv matchTemplate 不匹配

Posted

技术标签:

【中文标题】Opencv matchTemplate 不匹配【英文标题】:Opencv matchTemplate not matching 【发布时间】:2014-10-29 14:49:56 【问题描述】:

我正在使用 OpenCV 3.0.0 将图像定位到另一个图像中。先验的函数 matchTemplate 是我需要使用的,但是看到结果我不确定了。

问题在于,根据输入图像,结果是完全准确还是完全不准确。

示例 1:

主图

模板

结果

这里没有投诉。在这种情况下匹配是完美的。但是现在我将图像替换为我想要使用的图像并且......

主图

模板

结果

所以,根本不工作(图像右上角的结果矩形)。任何方法(在此示例中为 CORR NORMED)都会打印模板所在的矩形。所有的结果都远非准确。

所以,我的问题是,matchTemplate 的结果是否取决于主图像有多少种不同的颜色/形状? SURF 或 SIFT 会在这里帮助我吗? 你们现在有什么功能可以帮助我将模板定位到另一个图像中吗?

提前谢谢你!

PS:我没有添加任何代码,因为我猜不是那种问题,因为第一个示例运行良好。

【问题讨论】:

下载图片后,我很确定您的模板尺寸缩小了?模板匹配不是尺度不变的! 【参考方案1】:

您的问题可能是,模板匹配不是比例不变的,您的模板大小不适合对象大小。

使用这个输入和代码我得到那个输出:

输入图像:

输入模板:

代码:基本上取自 opencv 教程:http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html

int main()

    cv::Mat input = cv::imread("../inputData/TemplateMatch.jpg");

    cv::Mat gray;
    cv::cvtColor(input,gray,CV_BGR2GRAY);

    cv::Mat templ = cv::imread("../inputData/Template2.jpg");

    cv::Mat img = input;
    cv::Mat result;
    /// Create the result matrix
    int result_cols =  img.cols - templ.cols + 1;
    int result_rows = img.rows - templ.rows + 1;

    result.create( result_cols, result_rows, CV_32FC1 );

    int match_method = CV_TM_SQDIFF;

    /// Do the Matching and Normalize
    matchTemplate( img, templ, result, match_method  );
    normalize( result, result, 0, 1, cv::NORM_MINMAX, -1, cv::Mat() );

    /// Localizing the best match with minMaxLoc
    double minVal; double maxVal; cv::Point minLoc; cv::Point maxLoc;
    cv::Point matchLoc;

    minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, cv::Mat() );

    /// For SQDIFF and SQDIFF_NORMED, the best matches are lower values. For all the other methods, the higher the better
    if( match_method  == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED )
     matchLoc = minLoc; 
    else
     matchLoc = maxLoc; 

    /// Show me what you got
    cv::rectangle( input, matchLoc, cv::Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), cv::Scalar::all(0), 2, 8, 0 );
    cv::rectangle( result, matchLoc, cv::Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), cv::Scalar::all(0), 2, 8, 0 );


    cv::imshow("input", input);
    cv::imshow("template", templ);

    cv::imwrite("../outputData/TemplateMatch.jpg", input);
    cv::waitKey(0);
    return 0;

输出:

【讨论】:

哦,这就是问题所在。非常感谢米卡。欣赏它^^

以上是关于Opencv matchTemplate 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV-模板匹配cv::matchTemplate

Tadeas模板匹配matchTemplate介绍

在 OpenCV 中与屏幕捕获一起使用的函数 matchTemplate

Python 机器视觉 - 基于opencv图像模板匹配实现的简单人脸匹配实例演示,matchTemplate的6大模板匹配算法

Python 机器视觉 - 基于opencv图像模板匹配实现的简单人脸匹配实例演示,matchTemplate的6大模板匹配算法

OpenCV C++案例实战二十四《多目标匹配》