2013-05-22 1 views
2

У меня есть небольшое изображение 50x50. Я нахожу ORB с ключевыми точками:ORB вычислить ошибку: он удаляет все ключевые точки с небольшим изображением

(Обратите внимание, что я должен изменить параметры по умолчанию patchSize от 31 до 14 лет, чтобы получить некоторые ключевые точки, обнаруженные):

OrbFeatureDetector det(500,1.2f,8,14,0,2,0,14); //> (From 31 to 14) 
OrbDescriptorExtractor desc; 

det.detect(image,kp) 
//> kp.size() is about 50 keypoints 

Теперь если я передать свои ключевые точки на orb.compute Я удаляю все ключевые точки.

desc.compute(image,kp,kpDesc); 
//> Now kp.size() == 0 

Это означает, что после того, как я вызвал .compute, метод удалил все ключевые точки.

Изображение Я использую это: enter image description here

Я считаю, что это какая-то ошибка. Кто-то может подтвердить? Я использую OpenCV 2.4.5

+1

Как объявляются 'OrbFeatureDetector' и' OrbFeatureExtractor'? Вы инициализируете их чем-то другим, кроме параметров по умолчанию? Когда я пытаюсь обнаружить на вашем изображении, я не получаю обнаруженных ключевых точек. – Aurelius

+0

@Aurelius: да, я изменил PatchSize, чтобы найти больше ключевых точек. Я обновлю код – dynamic

+0

Хм, возможно, я тоже передал тот же параметр в OrbDescriptorExtractor. Да, я только что протестировал его. Теперь ключевые точки не стираются – dynamic

ответ

4

Нет, это не ошибка.

Проблема в том, что OrbDescriptorExtractor не знает, что вы изменили параметр в FeatureDetector. Таким образом, вы должны установить правильные Params снова:

OrbFeatureDetector  det(500,1.2f,8,14,0,2,0,14); //> (From 31 to 14) 
OrbDescriptorExtractor desc(500,1.2f,8,14,0,2,0,14); 
4

Вы создаете два объекта, детектор признаков и дескрипторов экстрактор. Они должны быть инициализированы с теми же параметрами.

Вы можете уменьшить дублирование кода в том, чтобы установить одинаковые параметры дважды путем создания одного экземпляра cv::ORB и затем вызвать cv::ORB::operator(), например, так:

cv::ORB orb(500,1.2f,8,14,0,2,0,14); 
orb(image,cv::noArray(),kp,kpDesc); 

Это будет идентичным вашим исходным раствором, так как особенность детектора и экстрактора - действительно тот же самый объект. Из заголовков OpenCV:

typedef ORB OrbFeatureDetector; 
typedef ORB OrbDescriptorExtractor; 
Смежные вопросы