2016-12-08 17 views
1

Я пытаюсь сравнить реализацию SIFT от OpenCV и VLFeat.Значения дескрипторов SIFT: OpenCV vs VLFeat

Я заметил, что значение дескрипторов для VLFeat являются целыми числами, такими как:

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

While для OpenCV:

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

Обратите внимание, что эти дескрипторы для 2-х разных изображений.

У меня есть два вопроса:

  1. Почему они имеют два различных значения?
  2. Если мне понадобится представление OpenCV для k-средств с использованием VLFeat (а затем VLAD-кодирования), нужно ли изменять эти значения?

ответ

1

Отказ от ответственности, я не эксперт в OpenCV или VLFeat, но я думаю, что знаю ответы.

VLFeat может генерировать как целочисленные, так и флоат-дескрипторы. Для генерации целочисленных дескрипторов используется функция vl_sift и для генерации дескрипторов float используется функция vl_dsift с параметром FloatDescriptors.

VLFeat, возможно, использует целые дескрипторы по соображениям производительности. Вычисления с использованием целых чисел, как правило, быстрее, чем использование поплавков. Однако это может быть за счет точности. Тем не менее, в случае компьютерного зрения меньшая точность может быть не столь важной. В описании integer k-means algorithm вы даже можете прочитать «Хотя это ограничение для некоторого приложения, оно хорошо работает для кластеризации дескрипторов изображений, где очень высокая точность обычно не нужна».

Что касается алгоритма k-mean. Существует версия (vl_ikmeans) для дескрипторов целых чисел и версия (vl_kmeans)] для дескрипторов float. С OpenCV просто используйте последнюю.

+0

'vl_sift'and' vl_dsift' * полностью * разные алгоритмы w.r.t. процедуры генерации ключевых точек, их нельзя сравнивать на основе значений дескрипторов (int или float). – justHelloWorld

+0

Согласно VLFeat [documentation] (http://www.vlfeat.org/matlab/vl_dsift.html): «По умолчанию VL_DSIFT() вычисляет функции, эквивалентные VL_SIFT()». Существует также пример, описанный как «В этом примере производятся эквивалентные дескрипторы SIFT с использованием VL_DSIFT() и VL_SIFT():« –

+0

Моя ошибка, я не знал, что поведение по умолчанию было одинаковым (я удалил -1;)). Однако DSIFT означает «Dense SIFT», а ключевые точки генерируются из стандартной сетки. Возможно, вы можете получить такое же поведение, но цель этих двух алгоритмов различна. – justHelloWorld