OpenCV SurfFeatureDetector излишне извлекает дескрипторы внутри? - PullRequest
1 голос
/ 18 ноября 2011

Мне просто интересно, если бы использование SurfFeatureDetector для обнаружения ключевых точек и SurfDescriptorExtractor для извлечения дескрипторов SURF (см. Код ниже, как описано здесь ) не извлекало бы дескрипторы дважды.

  SurfFeatureDetector detector( minHessian );

  std::vector<KeyPoint> keypoints;
  detector.detect( img, keypoints ); //detecting keypoints, extracting descriptors without returning them

  SurfDescriptorExtractor extractor;
  Mat descriptors;

  extractor.compute( img, keypoints, descriptors ); // extracting descriptors a second time

Документация openCV гласит, что эти 2 класса являются обертками для класса SURF (). SURF::operator() перегружен, одна версия принимает только вектор ключевой точки, а другая дополнительно принимает вектор для дескрипторов. Что меня заинтриговало ... оба затем вызывают функцию cvExtractSURF(), которая, кажется, извлекает дескрипторы, несмотря ни на что ... (Я не слишком углубился в код C, так как мне трудно это понять, поэтому, возможно, я ошибаюсь) Но это будет означать, что SurfFeatureDetector будет извлекать дескрипторы, не возвращая их. Использование SurfDescriptorExtractor на следующем шаге просто делает это во второй раз, что мне кажется очень неэффективным. Но я прав?

1 Ответ

3 голосов
/ 20 ноября 2011

Вы можете быть уверены, что детектор фактически не вычисляет дескрипторы.Ключевое утверждение, на которое следует обратить внимание, это строка 687 файла surf.cpp if( !descriptors ) continue;. Функции не вычисляются во время обнаружения, как это и должно быть.Такая архитектура наиболее вероятна из-за того, что код для серфинга был «добавлен» в OpenCV после того, как он был спроектирован / разработан для самостоятельной работы.

В качестве фона: обратите внимание, что детектор и экстракторы функций - это разные вещи,Сначала вы «обнаруживаете» точки, используя SurfFeatureDetector, где извлекаются локальные объекты (используя SurfDescriptorExtractor).Фрагмент, который у вас есть, является хорошим руководством.

...