【问题标题】:How to fix the number of SIFT keypoints?如何固定 SIFT 关键点的数量?
【发布时间】:2019-11-05 19:52:02
【问题描述】:

我正在尝试使用直接用于图像分类的 SIFT 描述符。 SIFT 定义为:Ptr<SIFT> sift = SIFT::create(100)。然后我预计将提取 100 个关键点。但实际检测到的关键点(sift->detect(img_resiz,keypoints))的数量并不总是 100(有时超过预设值)。怎么会这样?

我希望每个图像具有固定数量的关键点,以便在不同图像之间产生一致长度的描述符(在重新整形为行向量之后)(或者我可能需要基于词袋进行更多处理将筛选描述符表示为相同的维度)。

【问题讨论】:

    标签: c++ opencv sift


    【解决方案1】:

    函数KeyPointsFilter::retainBest(std::vector<KeyPoint>& keypoints, int n_points) 出现错误,您可以在此处看到:https://github.com/opencv/opencv/commit/3f3c8823ac22e34a37d74bc824e00a807535b91b
    我可以使用旧版本的 OpenCV (3.4.5) 重现该错误,有时您的 KeyPoint 比预期的多 1 个,例如101 而不是 100 因为那条标记线。

    如果您不想切换到较新的 OpenCV 版本,您可以执行以下操作:

    // Detect SIFT keypoints
    std::vector<cv::KeyPoint> keypoints_sift, keypoints_sift_100;
    cv::Ptr<cv::xfeatures2d::SiftFeatureDetector> sift = cv::xfeatures2d::SiftFeatureDetector::create(100);
    sift->detect(img, keypoints_sift);
    
    std::cout << keypoints_sift.size() << std::endl;
    for (size_t i = 0; i < 100; ++i) {
        keypoints_sift_100.push_back(keypoints_sift[i]);
    }
    

    因此,您将在检测后保留 100 个最佳关键点,因为它们按分数排名https://docs.opencv.org/4.1.0/d5/d3c/classcv_1_1xfeatures2d_1_1SIFT.html

    【讨论】:

      猜你喜欢
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 2015-01-01
      • 2014-06-03
      相关资源
      最近更新 更多