2011-08-29 14 views
26

Chcę zaimplementować algorytm dopasowania oparty na funkcjach za pomocą detektora funkcji ORB i ekstraktora.
Do tej pory wyodrębnione funkcje za pomocą ORB klasę z OpenCV ORB orb;
orb(gray_image,Mat(),features.keypoints,features.descriptors);
i dopasować je za pomocą funkcji knnMatch z OpenCV matcher.knnMatch(features1.descriptors, features2.descriptors, pair_matches,2); Potem staram się znaleźć homography użyciu funkcji findHomography, ale funkcja ta wymaga co co najmniej 4 dopasowania między funkcjami obrazu, a na większości testowanych obrazów dostałem mniej niż 4.W jaki sposób działa detektor funkcji OpenCV ORB?

Czy ktoś użył tej funkcji? Czy istnieje jakakolwiek dokumentacja na ten temat, czy też klasa ORB z OpenCV (znaczenie parametrów konstruktora ORB)?

P.S. To jest moje pierwsze pytanie. i nie mogę opublikować więcej niż 2 linków. Do dokumentacji opencv użyj this.

+0

Jakiego matchera użyłeś? –

+0

FlannBasedMatcher –

Odpowiedz

48

UPDATE: Teraz jest w dokumentacji OpenCV tutaj: http://opencv.itseez.com/modules/features2d/doc/feature_detection_and_description.html#orb

Szczegółowy opis algorytmu znajduje się tutaj: http://www.willowgarage.com/sites/default/files/orb_final.pdf


To nie jest wymieniona w OpenCV dokumentacja, ale faktycznie OpenCV ma:

Dwa rodzaje deskryptorów:

  • pływak deskryptorów:
    • przesiać
    • KIPIEL
  • uchar deskryptorów:
    • ORB
    • KRÓTKI

i odpowiadające dopasowujących:

  • dla deskryptorów float:
    • FlannBased
    • BruteForce<L2<float> >
    • BruteForce<SL2<float> > // od 2.3.1
    • BruteForce<L1<float> >
  • dla uchar descr iptors:
    • BruteForce<Hamming>
    • BruteForce<HammingLUT>
    • FlannBased z indeksem LSH // od 2.4.0

Więc trzeba zmodyfikować kod do wykorzystania na przykład BruteForce<Hamming> dopasowującego dla deskryptorów Orb. Możliwe jest użycie odległości L2 lub L1 dla pasujących deskryptorów uchar, ale wyniki będą niepoprawne i findHomography zwróci niezadowalające wyniki.

+2

Dziękujemy za szybką odpowiedź. Teraz działa lepiej dzięki BruteForceMatcher, ale wciąż mam niezadowalające wyniki w przypadku niektórych zdjęć. Myślę, że ORB może być wrażliwy na obrót/skalowanie, ponieważ używa krótkich deskryptorów. Czy mam rację? –

+0

W każdym razie, czy wiesz, gdzie mogę znaleźć więcej informacji na temat implementacji ORB w opencv? Widziałem, że klasa ORB może odbierać niektóre parametry (CommonParams), ale nie wiem jak je ustawić. –

+0

Właściwie deskryptory ORB są oparte na BRIEF, ale nie są dokładnie takie same (ORB jest skrótem dla Oriented BRIEF). Tak więc ORB jest bardziej wrażliwy na skalę niż obroty. Oto [nowe porównanie] (http://computer-vision-talks.com/2011/08/feature-descriptor-comparison-report/) funkcji OpenCV. A ORB to zupełnie nowy algorytm, który został dodany do OpenCV tylko tego lata, więc myślę, że w tej chwili jedynym dokumentem wyjaśniającym ORB jest oryginalna praca autorów ORB. –

Powiązane problemy