SIFT 描述符值:OpenCV 与 VLFeat

SIFT descriptors values: OpenCV vs VLFeat

我正在尝试比较 OpenCV and VLFeat 的 SIFT 实现。

我注意到 VLFeat 的描述符值是整数,例如:

0 0 0 0 0 0 0 0 0 0 0 17 45 20 26 0 1 ...

而对于 OpenCV:

0.0391555 0 0 0.0998274 0.235747 0 0 0.0276871 0.156622 ...

请注意,这些是 2 个不同图像的描述符。

我有两个问题:

  1. 为什么他们有两个不同的值?
  2. 如果我需要使用 VLFeat(然后是 VLAD 编码)的 k-means 的 OpenCV 表示,我需要更改这些值吗?

免责声明,我不是 OpenCV 或 VLFeat 方面的专家,但我认为我知道答案。

VLFeat 可以生成整数和浮点描述符。要生成整数描述符,请使用带有 FloatDescriptors 参数的 vl_sift function and in order to generate float descriptors use vl_dsift 函数。

VLFeat 可能出于性能原因使用整数描述符。使用整数的计算通常比使用浮点数更快。但是,这可能会以精度为代价。尽管如此,在计算机视觉的情况下,较小的精度可能并不是那么重要。在 integer k-means algorithm 的描述中,您甚至可以阅读 "While this is limiting for some application, it works well for clustering image descriptors, where very high precision is usually unnecessary"。

关于k-means算法。浮动描述符有一个版本 (vl_ikmeans) for integers descriptors and the version (vl_kmeans)]。对于 OpenCV,只需使用后者。