【问题标题】:OpenCV number of SIFT matches ever as the first keypoint numbersSIFT 匹配的 OpenCV 数作为第一个关键点数
【发布时间】:2015-03-24 23:01:43
【问题描述】:

使用此代码,当我打印匹配数时,我得到的数字与第一张图像中找到的关键点数相同... 例如,一个输出可能是

关键点数1:682

关键点数2:159

匹配数(FLANN):682

匹配数(蛮力):682

匹配的数量怎么可能多于第二张图像中的关键点数量?我希望匹配的数量小于或等于两个图像的关键点数量之间的最小值。

cv::SiftFeatureDetector  detector;
    detector = SiftFeatureDetector(
                                    0, // nFeatures
                                    4, // nOctaveLayers
                                    0.04, // contrastThreshold
                                    10, //edgeThreshold
                                    1.6 //sigma
                                    );


    std::vector<KeyPoint> keypoints1, keypoints2;

    int dxP = gray1.rows / 10;

    cv::Mat mask = cv::Mat::zeros(gray1.size(), CV_8U); // all 0
    mask(Rect(dxP, dxP, gray1.cols - 2*dxP, gray1.rows - 2*dxP)) = 1;

    detector.detect(gray1, keypoints1, mask);
    cout << "number of keypoints1: " << keypoints1.size() << endl;

    detector.detect(gray2, keypoints2, mask);
    cout << "number of keypoints2: " << keypoints2.size() << endl;

    SiftDescriptorExtractor extractor;
    Mat descriptors1, descriptors2;
    extractor.compute(gray1, keypoints1, descriptors1);
    extractor.compute(gray2, keypoints2, descriptors2);

    //Matching descriptor vectors using FLANN matcher
    FlannBasedMatcher matcher;
    std::vector< DMatch > matches;
    matcher.match(descriptors1, descriptors2, matches);
    cout << "number of matches (FLANN): " << matches.size() << endl;

    // Matching descriptor vectors using Brute Force matcher
    BFMatcher BFmatcher(NORM_L2);
    vector<DMatch> BFmatches;
    BFmatcher.match(descriptors1, descriptors2, BFmatches);

    cout << "number of matches (Brute Force): " << BFmatches.size() << endl;

【问题讨论】:

  • 不是 100% 确定,但我猜想从第一组到第二组计算完全匹配。这意味着,对于第一组的每个描述符,搜索第二组的最接近的描述符。所以如果 |s1| > |s2| s1 的多个描述符将与 s2 的相同描述符匹配。只需使用docs.opencv.org/modules/features2d/doc/…CROSS-CHECK参数即可

标签: c++ opencv matching sift feature-extraction


【解决方案1】:

这取决于参数的顺序,以实现您需要的反转顺序:

matcher.match(descriptors1, descriptors2, matches);

matcher.match(descriptors2, descriptors1, matches);

注意使用的顺序,即使是 OpenCV 文档也混淆了 matcher.match 调用的顺序,后来颠倒了 matches[i].trainIdxmatches[i].queryIdx

::match 的第一个参数是指查询描述符(即queryIdx

【讨论】:

    猜你喜欢
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 2014-09-17
    • 1970-01-01
    • 2020-12-27
    • 2018-03-10
    相关资源
    最近更新 更多