【问题标题】:OpenCV FREAK returns too many outliersOpenCV FREAK 返回太多异常值
【发布时间】:2012-12-12 17:27:44
【问题描述】:

我正在尝试最新版本的 OpenCV 中的全新描述符 FREAK,它遵循 freak_demo.cpp example。我没有使用 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);
  • 算法找到了很多匹配,但是有很多异常值。我做的事情对吗?有没有办法调整算法?

【问题讨论】:

    标签: c++ opencv freak


    【解决方案1】:

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

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

    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);
    

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

    【讨论】:

    • 我很好奇您的 “丢弃距离超过阈值的匹配项” 示例,但是当我尝试将其包含在我的代码中时,我收到了 错误i>“向量迭代器+偏移超出范围” ?
    【解决方案2】:

    您还可以通过提供自己选择的对来训练描述符。并调整构造函数中的参数。

    explicit FREAK( bool orientationNormalized = true
           , bool scaleNormalized = true
           , float patternScale = 22.0f
           , int nbOctave = 4
           , const vector<int>& selectedPairs = vector<int>()
         );
    

    顺便说一句,更高效的 FREAK 版本即将推出 :-)

    【讨论】:

    • 通过哪个参数或多个参数有效?我需要强大的 FREAK,而不是快速。我还需要强大的特征检测器,比如 MU-SURF。
    猜你喜欢
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2019-08-27
    • 2016-05-05
    • 1970-01-01
    • 2014-09-15
    相关资源
    最近更新 更多