OpenCV matchTemplate找到错误的匹配项,同时为maxVal

时间:2018-07-08 21:19:37

标签: c++ image opencv c++11

我正在使用OpenCV 3.4.1。

我最近重新启动了我正在从事的项目之一,并做了很多代码更改。在测试新代码时,我遇到了一个问题,我不知道该如何解决。


我修改后的函数如下(我在模板上使用cvtColor()函数,因为它具有alpha通道,并且在尝试执行matchtemplate时断言失败):

bool matchCoverSprite(cv::Mat Original, cv::Mat Template, int match_method = CV_TM_CCORR, double Tolerance = 0.3) {
cv::cvtColor(Template, Template, CV_BGRA2BGR);

cv::Mat result;

try {
    cv::matchTemplate(Original, Template, result, match_method, cv::Mat());
}
catch (cv::Exception &e) {
    std::cout << e.msg << std::endl;
}

double minVal; double maxVal; cv::Point minLoc; cv::Point maxLoc;
cv::Point matchLoc;
minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);

if (match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED)
{
    std::cout << "Tolerance was: " << minVal << std::endl;
    matchLoc = minLoc;

    if (minVal < 0.0 + Tolerance || Tolerance == -1.0) {

        /// Show me what you got
        rectangle(Original, matchLoc, cv::Point(matchLoc.x + Template.cols, matchLoc.y + Template.rows), cv::Scalar(255, 0, 0), 2, 8, 0);
        rectangle(result, matchLoc, cv::Point(matchLoc.x + Template.cols, matchLoc.y + Template.rows), cv::Scalar::all(0), 2, 8, 0);
        std::cout << "PASSED" << std::endl;
        return true;
    }
    else {
        return false;
    }
}
else
{
    std::cout << "Tolerance was: " << maxVal << std::endl;
    matchLoc = maxLoc;

    if (maxVal > 1.0 - Tolerance || Tolerance == -1.0) {

        /// Show me what you got
        rectangle(Original, matchLoc, cv::Point(matchLoc.x + Template.cols, matchLoc.y + Template.rows), cv::Scalar(255, 0, 0), 2, 8, 0);
        rectangle(result, matchLoc, cv::Point(matchLoc.x + Template.cols, matchLoc.y + Template.rows), cv::Scalar::all(0), 2, 8, 0);
        std::cout << "PASSED" << std::endl;
        return true;
    }
    else {
        return false;
    }
}


}

简要说明我在做什么和使用什么:

我有一堆图像保存到二进制文件中(使用跟随功能here进行读写),并且正在将所述二进制文件中的图像与模板进行比较。

这是二进制文件中的第一张图像(左侧为模板,右侧为我正在对其进行匹配的图像) Source and template image

但是最终会产生一个匹配项: The match


仔细研究为什么这会显示为匹配项时,我发现maxVal的值太大(上次我记得这样做的时候,该值始终在0-1之间):

big number

这就是我调用上面函数的方式:

if (matchCoverSprite(image, Sprite, CV_TM_CCOEFF, 0.02)) {
    found = true;
}

我尝试使用不同的匹配方法,但是它们都产生奇怪的maxVal和minVal值。

我在这里很茫然,不胜感激

0 个答案:

没有答案