如何确定SIFT关键点的数量?

时间:2019-06-24 02:33:50

标签: c++ opencv sift

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

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

1 个答案:

答案 0 :(得分: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进行排名。