【问题标题】:Eliminating false positives in feature descriptors消除特征描述符中的误报
【发布时间】:2014-06-19 10:05:00
【问题描述】:

给定两个转换为 cv::Mat 灰度的占用网格图,我使用 ORB 特征描述符并匹配从两个图像中提取的特征。其中大部分是误报。在下面,我只展示了一个关系来表明它确实是一个误报。

最终,我想做的是在两个占用网格地图之间找到正确的转换,以便将它们的地图合并为一个全局一致的地图。我当前的代码如下所示:

  // Load the two maps
    nav_msgs::OccupancyGrid map1;
    initOccupancyGridMap1(map1);
    nav_msgs::OccupancyGrid map2;
    initOccupancyGridMap2(map2);

    // Convert the two maps to grayscale images
    cv::Mat im1 = cvtMapToMat(map1);
    cv::Mat im2 = cvtMapToMat(map2);

    // Feature Descriptor Extraction
    cv::OrbFeatureDetector featureDetector;
    cv::OrbDescriptorExtractor featureExtractor;
    std::vector<cv::KeyPoint> kp1;
    std::vector<cv::KeyPoint> kp2;
    cv::Mat d1;
    cv::Mat d2;
    std::vector<cv::DMatch> matches;
    cv::BFMatcher dematc(cv::NORM_HAMMING, false);
    // 1. Detect keypoints
    featureDetector.detect(im1, kp1);
    featureDetector.detect(im2, kp2);
    // 2. Extract descriptors
    featureExtractor.compute(im1, kp1, d1);
    featureExtractor.compute(im2, kp2, d2);
    // 3. Match keypoints
    dematc.match(d1, d2, matches);

    for (int i = 0; i < matches.size(); i++){
        std::vector<cv::DMatch> match(1,matches[i]);

        std::cout << "Distance: " << match[0].distance << std::endl;
        cv::Mat img_show;
        drawMatches(im1, kp1, im2, kp2, match, img_show);
        imshow("Matches", img_show);
        cv::waitKey(0);
    }

【问题讨论】:

标签: opencv feature-extraction false-positive orb


【解决方案1】:

为了去除非常相似的点,我使用了第二近邻。如果该点与一个几乎相等的点匹配,则无法确定匹配是否正确。

例如,如果您的点 A 与点 B 和 C 匹配,那么如果它们至少相差 25%,您就可以认为 B 是一个很好的匹配(这个差异是我选择的,但您可以尝试使用其他数字)。 .

代码如下:

 // 2. Extract descriptors
featureExtractor.compute(im1, kp1, d1);
featureExtractor.compute(im2, kp2, d2);
// 3. Match keypoints

std::vector<cv::DMatch> goodMatches;
// Instead match only one point, try to match with 2.
matcher.knnMatch( d1, d2, matches, 2 );

for(int i = 0; i< matches.size(); i++){  // matches from matcher
    //with this condition we check that the points are at least 25% diferent.
    if(matches[i].at(0).distance< 0.75*matches[i].at(1).distance){
         goodMatches.push_back(matches[i].at(0));
    }
}

【讨论】:

    猜你喜欢
    • 2013-01-01
    • 2012-05-30
    • 2014-05-15
    • 2015-05-11
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多