SIFT描述子维度

3
我想了解是否可以更改SIFT描述符的维度,如果可以,如何进行更改。我知道当前维度是128,我们能否将其变为128 * 4或124/4之类的值?
更新:我尝试通过修改opencv/modules/nonfree/src/sift.cpp中的SIFT_DESCR_WIDTH属性值从4更改为2,但是它并没有改变描述符的维度。当我打印descriptors.size()时,它仍然打印出128。
此致敬礼,

抱歉,我没有看到标签。不,你不能在不改变OpenCV源代码的情况下更改SIFT维度。你重新编译了带有新参数的OpenCV吗?那么更改的目的是什么? - old-ufo
我该如何重新编译它?能否请您写下答案,这样如果它有效,我就可以接受答案。目的很简单。我只想测试它对性能和效果的影响。谢谢。 - MMH
@old-ufo,它起作用了。请写出解决方案,以便我可以接受并标记问题已解决。非常感谢。 - MMH
我的任务越简单,小尺度不变特征变换(SIFT)的效果就越完美。 - MMH
也许PCA-SIFT更适合您的任务?http://www.cs.cmu.edu/~yke/pcasift/ - old-ufo
显示剩余6条评论
3个回答

1

如果您想改变OpenCV中SIFT的维度,就必须更改OpenCV源代码。因此,您需要更改源代码并重新编译整个OpenCV或非免费模块。

更改该常量值,然后为OpenCV执行cmake和make。

P.S. 实际上,这对您来说不会有太大影响 - 可以查看原始SIFT论文,其中包含第8图。


0
你可以尝试使用SURF描述符,它支持64维,并且计算速度比SIFT更快。

谢谢你的回答。我知道SURF更快,但我想只使用SIFT进行测试。 - MMH

0
你可以使用PCA(主成分分析)来尝试将从图像中提取的描述符从128维降低到64维(或任何你选择的维度)。你正在使用C++,但我在我的OpenCV工作中使用Python,并使用sklearn.decomposition进行这个操作(我相信你可以找到一个类似的C++库)。基本上它类似于压缩。当然,你会损失一些准确性。
参见https://en.wikipedia.org/wiki/Principal_component_analysis 当然,你对数据集进行测试的任何图像也需要使用相同维度设置对其描述符向量运行PCA。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接