Как работает детектор функций 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.1
    • BruteForce<L1<float> >
  • для дескрипторов uchar:
    • BruteForce<Hamming>
    • BruteForce<HammingLUT>
    • FlannBased с индексом LSH // начиная с 2.4.0

Так что вам нужно изменить свой код, чтобы использовать, например, BruteForce<Hamming> совпадение для дескрипторов ORB. Можно использовать расстояние L2 или L1 для сопоставления дескрипторов uchar, но результаты будут неверными, а findHomography выдаст неудовлетворительные результаты.

Другие вопросы по тегам