Извлечение дескрипторов точек из небольших изображений с помощью OpenCV

Я пытаюсь извлечь различные дескрипторы точек (SIFT, SURF, ORB, BRIEF,...) для создания пакета визуальных слов. Проблема в том, что я использую очень маленькие изображения: 12x60px. Используя плотный экстрактор, я могу получить некоторые ключевые точки, но тогда при извлечении дескриптора данные не извлекаются.

Вот код:

vector<KeyPoint> points;
Mat descriptor; // descriptor of the current image
Ptr<DescriptorExtractor> extractor = DescriptorExtractor::create("BRIEF");
Ptr<FeatureDetector> detector(new DenseFeatureDetector(1.f,1,0.1f,6,0,true,false));
image = imread(filename, 0);
roi = Mat(image,Rect(0,0,12,60));

detector->detect(roi,points);

extractor->compute(roi,points,descriptor);
cout << descriptor << endl;

Результатом является [] (с BRIEF и ORB) и SegFault (с SURF и SIFT). Кто-нибудь знает, как плотно извлекать дескрипторы точек из небольших изображений в OpenCV? Спасибо за вашу помощь.


person HnT    schedule 28.10.2013    source источник


Ответы (2)


BRIEF и ORB используют патч 32x32 для получения дескриптора. Поскольку это не соответствует вашему изображению, они удаляют эти ключевые точки (чтобы не возвращать ключевые точки без дескриптора).

В случае SURF и SIFT они могут использовать меньшие патчи, но это зависит от масштаба, обеспечиваемого ключевой точкой. В этом случае, я думаю, они должны использовать патч большего размера, и происходит то же самое, что и раньше. Я не знаю, почему вы получаете segfault; возможно, экстракторы дескрипторов SIFT/SURF не проверяют, что ключевые точки находятся внутри границ изображения, как это делают BRIEF/ORB.

person ChronoTrigger    schedule 28.10.2013

Действительно, мне наконец удалось найти решение. Спасибо за помощь.

Теперь я использую детектор Orb с инициализированными параметрами вместо случайного, например:

Ptr<DescriptorExtractor> extractor(new ORB(500, 1.2f, 8, orbSize, 0, 2, ORB::HARRIS_SCORE, orbSize));

Мне пришлось тщательно изучить документацию OpenCV, прежде чем найти ответ на мою проблему: документация Orb.

Кроме того, если люди используют экстрактор плотных точек, они должны знать, что после процесса вычисления дескриптора у них может быть меньше ключевых точек, чем было создано экстрактором ключевых точек. Вычисление дескриптора удаляет все ключевые точки, для которых невозможно получить данные.

person HnT    schedule 29.10.2013