c++ - 如何固定 SIFT 关键点的数量?
问题描述
我正在尝试使用直接用于图像分类的 SIFT 描述符。SIFT 定义为:Ptr<SIFT> sift = SIFT::create(100)
。然后我预计将提取 100 个关键点。但实际检测到的关键点 ( sift->detect(img_resiz,keypoints)
) 的数量并不总是 100(有时会超过预设值)。怎么会这样?
我希望每个图像具有固定数量的关键点,以便在不同图像之间产生一致长度的描述符(在重新整形为行向量之后)(或者我可能需要基于词袋进行更多处理来表示将描述符筛选到相同的维度)。
解决方案
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。
推荐阅读
- ios - 如何将单元格宽度与框架宽度不同的 UICollectionviewCell 居中并启用分页
- handlebars.js - 这段代码在 handlebar.js {{{number this.col1}}} 中是什么意思?
- python - 表单提交时自动创建字段
- java - 如何获得 JavaFx 建议,例如
- javascript - PWA 应用的自动更新解决方案
- python - 如何组合两个列表以获得所有组合(即 list1=["a","b", "c"] list2=["1","2","3"] Wantoutcome=["a1"," a2","a3","b1","b2"...."c3"]
- python - 使用 --job-dir 时未创建 GCP 输出目录
- vba - API SetTimer 的声明?
- javascript - 如何将新属性添加到现有的 json 对象
- clojurescript - 如何从 Clojure 中的 HTTP 请求中提取正文?