2015-05-19 8 views
1

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

Пример кода ниже:

int minHessian = 100; 
SurfFeatureDetector detector(minHessian); 
Mat descriptors_object; 
SurfDescriptorExtractor extractor; 
detector.detect(img_object, keypoints_object); 
extractor.compute(img_object, keypoints_object,descriptors_object); 
for (int index = 0; index < listOfObjectsExtracted.size(); index ++) 
{ 
     Mat partOfImageScene = listOfObjectsExtracted[index]; 
     vector<Point2f> listOfContourPoints = convertPointsToPoints2f(realContoursOfRects[index]); 
     vector<KeyPoint> keypoints_scene; 
     KeyPoint::convert(listOfContourPoints, keypoints_scene, 100, 1000); 
     //detector.detect(partOfImageScene, keypoints_scene); 
     if (keypoints_scene.size() > 0) 
     { 
      //-- Step 2: Calculate descriptors (feature vectors) 
      Mat descriptors_scene; 
      extractor.compute(partOfImageScene, keypoints_scene, descriptors_scene); 
      //Logic of matching between descriptors_scene and descriptors_object 
     } 
} 

Таким образом, после вызова compute на шаге 2, keypoints_scene большую часть времени становится пустым. Я знаю, что они заявляют следующее в OpenCV документации:

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

Но так или иначе, чтобы получить лучшие результаты? Я имею в виду иметь дескрипторы для всех пунктов, которые я выбрал? Я нарушаю способ использования ключевых точек? Должен ли я попробовать другой экстрактор функций, чем SIFT/SURF, чтобы получить то, что я хочу? Или ожидается, что он будет иметь такую ​​же проблему с любым детектором функций, реализованным в OpenCV?

EDITED:

Я использую метод KeyPoint::convert для преобразования точек в ключевые точки и я передаю 100 как размер и 1000, как ответ. Ниже вы можете ознакомиться с деталями этого метода:

//! converts vector of points to the vector of keypoints, where each keypoint is assigned the same size and the same orientation 
    static void convert(const vector<Point2f>& points2f, 
         CV_OUT vector<KeyPoint>& keypoints, 
         float size=1, float response=1, int octave=0, int class_id=-1); 

Как размер, 100 мне кажется, нет? Если нет, любой способ получить лучшее значение, которое подходит для моего случая? или это просто эмпирически?

EDITED: Размер изображения 1920 * 1080, вот sample

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

+1

Какую ключевую точку «размер» или «масштаб» вы указали на свои пользовательские ключевые точки? В зависимости от этого значения вычисляется размер окна дескриптора. Если он слишком большой (или, может быть, слишком маленький), дескриптор не может быть вычислен. – Micka

+1

Отредактированный вопрос, @Micka – Maystro

+0

вы можете попробовать размер = 1? не знаю, как точно определяется размер в SIFT/Surf (например, как размер окна дескриптора вычисляется из размера ключа), но, возможно, это были значения, такие как 8, 16 и т. д., но я действительно не помню, какая октава была ... – Micka

ответ

1

Я понял. Проблема заключалась в том, как я вычисляю дескрипторы, потому что, как вы можете видеть в приведенном выше коде, я пытался вычислить дескрипторы на малой части изображения, а не на самом изображении. Поэтому, когда я сам поставил изображение вместо partOfImageScene, что-то вроде extractor.compute(img_scene, keypoints_scene, descriptors_scene); работал отлично, и я не потерял никаких ключевых точек из списка, который у меня был.

Смежные вопросы