У меня есть небольшое изображение 50х50. Я нахожу ключевые точки 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, метод удалил все ключевые точки.
Изображение, которое я использую это:
Я считаю, что это какая-то ошибка. Кто-то может подтвердить? Я использую OpenCV 2.4.5
Нет, это не ошибка.
Проблема в том, что OrbDescriptorExtractor не знает, что вы изменили параметр в FeatureDetector. Таким образом, вы должны снова установить правильные параметры:
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);
Вы создаете два объекта, детектор объектов и экстрактор дескриптора. Они должны быть инициализированы с теми же параметрами.
Вы можете уменьшить дублирование кода, установив одинаковые параметры дважды, создав один экземпляр 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;