OpenCV FREAK返回太多异常值

Mar*_*mos 7 c++ opencv freak

我正在尝试从freak_demo.cpp 示例之后的最新版本的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);
Run Code Online (Sandbox Code Playgroud)
  • 该算法找到了很多匹配,但是有很多异常值.我做对了吗?有没有办法调整算法?

Jav*_*ock 16

在进行匹配时,总会有一些细化步骤可以摆脱异常值.

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

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

然后,我使用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);
Run Code Online (Sandbox Code Playgroud)

而我只是绘制内部因素:

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);
Run Code Online (Sandbox Code Playgroud)

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