首页 > 解决方案 > 如何固定 SIFT 关键点的数量?

问题描述

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

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

标签: c++opencvsift

解决方案


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


推荐阅读