gpt4 book ai didi

Opencv matchTemplate 不匹配

转载 作者:太空宇宙 更新时间:2023-11-03 21:15:47 26 4
gpt4 key购买 nike

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

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

示例 1:

主图

Simple

模板

Simple

结果

Simple

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

主图

Complex

模板

Complex

结果

enter image description here

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

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

提前致谢!

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

最佳答案

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

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

输入图像:

enter image description here

输入模板:

enter image description here

代码:基本上取自 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;
}

输出:

enter image description here

关于Opencv matchTemplate 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26633461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com