【问题标题】:OpenCV template matching parametersOpenCV模板匹配参数
【发布时间】:2015-08-21 16:05:06
【问题描述】:

在以下模板匹配代码中,我不明白以下行在做什么:

cv::Mat res(ref.rows-tpl.rows+1, ref.cols-tpl.cols+1, CV_32FC1);

完整代码为:

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

int main()
{
    cv::Mat ref = cv::imread("ref.jpg");
    cv::Mat tpl = cv::imread("temp.jpg");
    if (ref.empty() || tpl.empty())
        return -1;

    cv::Mat gref, gtpl;
    cv::cvtColor(ref, gref, CV_BGR2GRAY);
    cv::cvtColor(tpl, gtpl, CV_BGR2GRAY);

    cv::Mat res(ref.rows - tpl.rows + 1, ref.cols - tpl.cols + 1, CV_32FC1);
    cv::matchTemplate(gref, gtpl, res, CV_TM_CCOEFF_NORMED);
    cv::threshold(res, res, 0.8, 1., CV_THRESH_TOZERO);

    while (true)
    {
        double minval, maxval, threshold = 0.8;
        cv::Point minloc, maxloc;
        cv::minMaxLoc(res, &minval, &maxval, &minloc, &maxloc);

        if (maxval >= threshold)
        {
            cv::rectangle(
                ref,
                maxloc,
                cv::Point(maxloc.x + tpl.cols, maxloc.y + tpl.rows),
                CV_RGB(0, 255, 0), 2
                );
            cv::floodFill(res, maxloc, cv::Scalar(0),
                0, cv::Scalar(.1), cv::Scalar(1.));
        }
        else
            break;
    }

    cv::imshow("reference", ref);
    cv::waitKey();
    return 0;
}

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    它正在创建包含匹配结果的矩阵。

    根据matchTemplate的文档

    • result – 比较结果图。它必须是单通道 32 位浮点数。如果图像为 W x H 且模板为 w x h ,则结果为 (W-w+1) x (H-h+1)。

    参考您的代码:

    image    -> ref
    template -> tpl
    W        -> ref.cols
    H        -> ref.rows
    w        -> tpl.cols
    h        -> tpl.rows 
    
    single-channel 32-bit floating-point -> CV_32FC1
    

    但是,由于matchTemplate 将创建结果图像,因此您无需创建它。你可以简单地:

    ...
    cv::Mat res;
    cv::matchTemplate(gref, gtpl, res, CV_TM_CCOEFF_NORMED);
    ...
    

    【讨论】:

    • 你的意思是它正在为结果图像创建类似容器的东西吗?
    • @user3072028 它正在创建结果矩阵。该矩阵的每个值都是模板与该点图像之间的距离(或相似度,根据使用的方法)。
    • 感谢回答我的理解是,结果就像一个边框,它将指定源图像中与模板匹配的区域
    • @sarmad 如您所见here,结果在模板的左上角。所以你需要一个“边框”来避免在图像中太right或太down。但是,您实际上可以忽略所有这些,因为您可以简单地避免一开始就创建结果矩阵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多