gpt4 book ai didi

c++ - OpenCV FREAK 返回太多异常值

转载 作者:可可西里 更新时间:2023-11-01 18:09:12 25 4
gpt4 key购买 nike

我正在尝试在 freak_demo.cpp example 之后的最新版本的 OpenCV 中使用全新的描述符 FREAK .我没有使用 SURF,而是使用 FAST。我的基本代码是这样的:

std::vector<KeyPoint> keypointsA, keypointsB;
Mat descriptorsA, descriptorsB;
std::vector<DMatch> matches;

FREAK extractor;
BruteForceMatcher<Hamming> matcher;

FAST(imgA,keypointsA,100);
FAST(imgB,keypointsB,20);

extractor.compute( imgA, keypointsA, descriptorsA );
extractor.compute( imgB, keypointsB, descriptorsB );

matcher.match(descriptorsA, descriptorsB, matches);
  • 该算法找到了很多匹配项,但也有很多离群值。我做的对吗?有没有办法调整算法?

最佳答案

在进行匹配时,总会有一些改进步骤来去除异常值。

我通常做的是丢弃距离超过阈值的匹配项,例如:

for (int i = 0; i < matches.size(); i++ )
{
if(matches[i].distance > 200)
{
matches.erase(matches.begin()+i-1);
}
}

然后,我使用 RANSAC 查看哪些匹配符合单应性模型。 OpenCV 有一个函数:

for( int i = 0; i < matches.size(); i++ )
{
trainMatches.push_back( cv::Point2f(keypointsB[ matches[i].trainIdx ].pt.x/500.0f, keypointsB[ matches[i].trainIdx ].pt.y/500.0f) );
queryMatches.push_back( cv::Point2f(keypointsA[ matches[i].queryIdx ].pt.x/500.0f, keypointsA[ matches[i].queryIdx ].pt.y/500.0f) );
}

Mat h = cv::findHomography(trainMatches,queryMatches,CV_RANSAC,0.005, status);

我只画了内点:

for(size_t i = 0; i < queryMatches.size(); i++) 
{
if(status.at<char>(i) != 0)
{
inliers.push_back(matches[i]);
}
}

Mat imgMatch;
drawMatches(imgA, keypointsA, imgB, keypointsB, inliers, imgMatch);

只需尝试不同的阈值和距离,直到获得所需的结果。

关于c++ - OpenCV FREAK 返回太多异常值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13835309/

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