C++ OpenCV matchTemplate在为maxVal返回大量数据时发现错误匹配

C++ OpenCV matchTemplate在为maxVal返回大量数据时发现错误匹配,c++,image,opencv,c++11,C++,Image,Opencv,C++11,我正在使用OpenCV 3.4.1 我最近重新启动了一个我正在进行的项目,并做了很多代码更改。在测试新代码时,我遇到了一个问题,我不知道如何解决这个问题 我修改过的函数如下所示(我在模板上使用cvtColor()函数,因为它有一个alpha通道,当我尝试执行匹配模板时,它的断言失败): 我尝试过使用不同的匹配方法,但它们都会产生奇怪的maxVal和minVal值 我在这里不知所措,因此非常感谢您提供的任何帮助您正在使用带有CV\u TM\u CCOEFF的非规范化匹配函数。看看,看看不同的可

我正在使用OpenCV 3.4.1

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


我修改过的函数如下所示(我在模板上使用cvtColor()函数,因为它有一个alpha通道,当我尝试执行匹配模板时,它的断言失败):


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


我在这里不知所措,因此非常感谢您提供的任何帮助

您正在使用带有
CV\u TM\u CCOEFF
的非规范化匹配函数。看看,看看不同的可能性。这里的高值并不奇怪。尝试使用不同的匹配方法,看看哪种方法效果最好。此外,请记住,尽管某些匹配可能会让你的眼睛在查看图像中的对象时感到惊讶,但OpenCV只查看原始数值,而那些奇怪的匹配可能确实是最好的。@Sunreef我现在使用CV_TM_CCOEFF_NORMED,它给我的maxVal和minVal值介于1和0之间。但是,我现在很困惑,因为我有另一个使用非规范化匹配方法的函数,它的maxVal/minVal值在1和0之间
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;
    }
}


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