2012-06-20 4 views
3

Bascially вы должны сначала сделать:Почему KeyPoint «детектор» и «экстрактор» различны?

SurfFeatureDetector surf(400); 
surf.detect(image1, keypoints1); 

, а затем:

surfDesc.compute(image1, keypoints1, descriptors1); 

Почему обнаружить и вычи являются 2 разные операции?
Выполнение вычислений после обнаружения не создает петли избыточности?

Я обнаружил, что .compute является самым дорогим в моем приложении.

.detect 

делается в 0.2secs

.compute 

принимает ~ 1сек. Есть ли способ ускорить .compute?

ответ

3

Существует различие между обнаружением ключевых точек изображения и вычислением дескрипторов для этих ключевых точек. Например, вы можете извлекать ключевые точки SURF и вычислять функции SIFT. Обратите внимание, что в методе DescriptorExtractor :: вычислительном, фильтры на ключевых точках применяются:

KeyPointsFilter::runByImageBorder() 
KeyPointsFilter::runByKeypointSize(); 
+0

HMM это интересно! знаете ли вы каким-либо способом вычислить его быстрее? Мой профиль показывает, что '.compute' - это часть, которая занимает больше времени, чем другая. – dynamic

+0

Это зависит от потребностей вашего приложения, но вы должны попробовать BRIEF дескриптор. Они предназначены для более быстрого вычисления, чем SURF, и очень похожи. Если вы действительно хотите использовать SURF, вы можете выбрать меньшее количество точек в своем изображении или с помощью фильтрации с помощью пространственного ограничения? – Eric

+0

Да, я думал, что (выберите менее ключевую точку). Вы бы отфильтровали вектор ключевой точки после ее вычисления (с помощью '.detect') или предварительно выбранного нескольких ключевых точек? (возможно, с hessian threshold?) – dynamic

9

Обнаружения ключевых точек просто процесс выбора точек на изображении, которые считаются «хорошими возможностями».

Извлечение дескрипторов этих ключевых точек - это совершенно другой процесс, который кодирует свойства этой функции, такие как контраст с соседями и т. Д., Поэтому ее можно сравнить с другими ключевыми точками от разных изображений, разных оттенков и ориентации.

Способ описания ключевой точки может иметь решающее значение для успешного согласования, и это действительно ключевой фактор. Также способ определения ключевой точки является определяющим для скорости согласования. Например, вы можете описать его как float или как двоичную последовательность.

0

Поднимаясь от места, где находится Jay_Rock, вы можете улучшить эти времена обработки, используя двоичный дескриптор, предлагаемый такими алгоритмами, как ORB, Brisk или FREAK. Они не только занимают 32 бит вместо 64, но также предлагают разные методы для вычисления дескрипторов, которые столь же надежны, как SURF и намного быстрее.

Если вы в конечном итоге хотите выполнить соответствующие операции между дескрипторами, это делается путем вычисления расстояния Хэмминга между ними. Учитывая, что это операция XOR между двумя двоичными строками, требуется всего несколько миллисекунд.