Как работает детектор функций OpenCV ORB?
Я хочу реализовать алгоритм выравнивания на основе объектов, используя детектор и экстрактор ORB.
Пока что я извлек функции с помощью класса ORB из OpenCVORB orb;
orb(gray_image,Mat(),features.keypoints,features.descriptors);
и сопоставил их, используя функцию knnMatch из openCV matcher.knnMatch(features1.descriptors, features2.descriptors, pair_matches,2);
После этого я пытаюсь найти гомографию с помощью функции findHomography, но для этой функции требуется как минимум 4 совпадения между функциями изображения, а на большинстве протестированных изображений я получил менее 4.
Кто-нибудь использовал эту функцию? Есть ли какая-либо документация об этом или о классе ORB из OpenCV(значение параметров конструктора ORB)?
PS Это мой первый вопрос. и я не могу опубликовать более 2 ссылок. Для документации opencv используйте это.
1 ответ
ОБНОВЛЕНИЕ: Теперь это находится в документации OpenCV, здесь: http://opencv.itseez.com/modules/features2d/doc/feature_detection_and_description.html
Подробное описание алгоритма находится здесь: http://www.willowgarage.com/sites/default/files/orb_final.pdf
Это не упоминается в документации OpenCV, но на самом деле OpenCV имеет:
Два типа дескрипторов:
- дескрипторы типа float:
- ПРОСЕЯТЬ
- SURF
- дескрипторы uchar:
- ORB
- КРАТКАЯ
И соответствующие соответствия:
- для дескрипторов типа float:
FlannBased
BruteForce<L2<float> >
BruteForce<SL2<float> >
// с 2.3.1BruteForce<L1<float> >
- для дескрипторов uchar:
BruteForce<Hamming>
BruteForce<HammingLUT>
FlannBased
с индексом LSH // начиная с 2.4.0
Так что вам нужно изменить свой код, чтобы использовать, например, BruteForce<Hamming>
совпадение для дескрипторов ORB. Можно использовать расстояние L2 или L1 для сопоставления дескрипторов uchar, но результаты будут неверными, а findHomography выдаст неудовлетворительные результаты.