我正在使用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进行读写),并且正在将所述二进制文件中的图像与模板进行比较。
这是二进制文件中的第一张图像(左侧为模板,右侧为我正在对其进行匹配的图像)
仔细研究为什么这会显示为匹配项时,我发现maxVal的值太大(上次我记得这样做的时候,该值始终在0-1之间):
这就是我调用上面函数的方式:
if (matchCoverSprite(image, Sprite, CV_TM_CCOEFF, 0.02)) {
found = true;
}
我尝试使用不同的匹配方法,但是它们都产生奇怪的maxVal和minVal值。
我在这里很茫然,不胜感激