Detektoren und Deskriptoren von singulÀren Punkten FAST, BRIEF, ORB

Dieser Artikel konzentriert sich auf einige Suchalgorithmen und Beschreibungen bestimmter Bildpunkte. Hier wurde dieses Thema bereits mehr als einmal angesprochen . Ich werde berĂŒcksichtigen, dass die grundlegenden Definitionen dem Leser bereits bekannt sind. Wir werden die heuristischen Algorithmen FAST, FAST-9, FAST-ER, BRIEF, rBRIEF, ORB im Detail untersuchen und die ihnen zugrunde liegenden funkelnden Ideen diskutieren. Zum Teil wird dies eine freie Übersetzung des Wesens mehrerer Artikel sein [1,2,3,4,5], es wird einen Code fĂŒr "try" geben.

Bild

SCHNELLER Algorithmus


FAST, erstmals 2005 in [1] vorgeschlagen, war eine der ersten heuristischen Methoden zum Auffinden einzelner Punkte, die aufgrund ihrer Recheneffizienz große PopularitĂ€t erlangte. Um zu entscheiden, ob ein bestimmter Punkt C als speziell betrachtet werden soll oder nicht, berĂŒcksichtigt diese Methode die Helligkeit von Pixeln auf einem Kreis, der auf Punkt C und Radius 3 zentriert ist:

Bild

Wenn wir die Helligkeit der Pixel des Kreises mit der Helligkeit des Zentrums C vergleichen, erhalten wir jeweils drei mögliche Ergebnisse (heller, dunkler, wie es scheint):

$ inline $ \ begin {array} {l} {I_p}> {I_C} + t \\ {I_p} <{I_C} -t \\ {I_C} -t <{I_p} <{I_C} + t \ end {array} $ inline $

Hier ist I die Helligkeit der Pixel, t ist eine vorbestimmte Helligkeitsschwelle.
Ein Punkt wird als speziell markiert, wenn in einer Reihe n = 12 Pixel dunkler oder 12 Pixel heller als die Mitte sind.

Wie die Praxis im Durchschnitt gezeigt hat, mussten fĂŒr eine Entscheidung etwa 9 Punkte ĂŒberprĂŒft werden. Um den Prozess zu beschleunigen, schlugen die Autoren vor, zunĂ€chst nur vier Pixel mit Zahlen zu ĂŒberprĂŒfen: 1, 5, 9, 13. Wenn unter ihnen 3 Pixel heller oder dunkler sind, wird eine vollstĂ€ndige ÜberprĂŒfung an 16 Punkten durchgefĂŒhrt, andernfalls wird der Punkt sofort als „markiert nicht besonders. " Dies verkĂŒrzt die Arbeitszeit erheblich. FĂŒr eine Entscheidung im Durchschnitt reicht es aus, nur etwa 4 Punkte eines Kreises abzufragen.

Hier liegt ein bisschen naiver Code
Variable Parameter (im Code beschrieben): Kreisradius (nimmt die Werte 1,2,3 an), Parameter n (im Original n = 12), Parameter t. Der Code öffnet die Datei in.bmp, verarbeitet das Bild und speichert es in out.bmp. Bilder sind gewöhnliche 24-Bit.

Erstellen eines Entscheidungsbaums, Tree FAST, FAST-9


Im Jahr 2006 war es in [2] möglich, eine originelle Idee mithilfe von maschinellem Lernen und EntscheidungsbÀumen zu entwickeln.

Das Original FAST hat folgende Nachteile:

  • Mehrere benachbarte Pixel können als Sonderpunkte markiert werden. Wir brauchen ein gewisses Maß fĂŒr die "StĂ€rke" eines Features. Eine der ersten vorgeschlagenen Maßnahmen ist der Maximalwert von t, bei dem der Punkt noch als Sonderwert angenommen wird.
  • Ein schneller 4-Punkte-Test wird nicht fĂŒr n weniger als 12 verallgemeinert. So werden beispielsweise visuell die besten Ergebnisse der Methode mit n = 9 und nicht mit 12 erzielt.
  • Ich möchte auch den Algorithmus beschleunigen!

Anstatt eine Kaskade von zwei Tests mit 4 und 16 Punkten zu verwenden, wird vorgeschlagen, alles in einem Durchgang durch den Entscheidungsbaum zu erledigen. Ähnlich wie bei der ursprĂŒnglichen Methode werden wir die Helligkeit des Mittelpunkts mit den Punkten auf dem Kreis vergleichen, aber in dieser Reihenfolge, um die Entscheidung so schnell wie möglich zu treffen. Und es stellt sich heraus, dass Sie im Durchschnitt nur fĂŒr ~ 2 (!!!) Vergleiche eine Entscheidung treffen können.

Das Salz ist, wie man die richtige Reihenfolge fĂŒr den Vergleich von Punkten findet. Finden Sie mit maschinellem Lernen. Angenommen, jemand hat fĂŒr uns auf dem Bild viele Besonderheiten festgestellt. Wir werden sie als eine Reihe von Schulungsbeispielen verwenden, und die Idee ist, eifrig diejenige auszuwĂ€hlen, die in diesem Schritt die grĂ¶ĂŸte Menge an Informationen als nĂ€chsten Punkt liefert. Angenommen, anfangs gab es in unserer Stichprobe 5 singulĂ€re Punkte und 5 nicht singulĂ€re Punkte. In Form einer Tablette wie dieser:

Bild

Jetzt wĂ€hlen wir eines der Pixel p des Kreises und vergleichen fĂŒr alle singulĂ€ren Punkte das zentrale Pixel mit dem ausgewĂ€hlten. AbhĂ€ngig von der Helligkeit des ausgewĂ€hlten Pixels in der NĂ€he jedes bestimmten Punkts kann die Tabelle das folgende Ergebnis haben:

Bild

Die Idee ist, einen Punkt p so zu wĂ€hlen, dass die Zahlen in den Spalten der Tabelle so unterschiedlich wie möglich sind. Und wenn wir jetzt fĂŒr einen neuen unbekannten Punkt das Vergleichsergebnis „Leichter“ erhalten, können wir bereits sofort sagen, dass der Punkt „nicht speziell“ ist (siehe Tabelle). Der Prozess wird rekursiv fortgesetzt, bis die Punkte nur einer der Klassen in jede Gruppe fallen, nachdem sie in "dunkler wie heller" unterteilt wurden. Es stellt sich ein Baum der folgenden Form heraus:

Bild

Der BinĂ€rwert befindet sich in den BlĂ€ttern des Baums (Rot ist speziell, GrĂŒn ist nicht speziell) und an den anderen Eckpunkten des Baums befindet sich die Nummer des Punkts, der analysiert werden muss. Insbesondere schlagen sie im Originalartikel vor, die Punktnummer durch Ändern der Entropie zu wĂ€hlen. Die Entropie der Punktmenge wird berechnet:

$$ display $$ H = \ left ({c + \ overline c} \ right) {\ log _2} \ left ({c + \ overline c} \ right) - c {\ log _2} c - \ overline c {\ log _2} \ overline c $$ display $$



c ist die Anzahl der singulÀren Punkte, $ inline $ {\ bar c} $ inline $ Ist die Anzahl der nicht singulÀren Punkte der Menge

EntropieÀnderung nach Verarbeitungspunkt p:

$$ Anzeige $$ \ Delta H = H - {H_ {dunkel}} - {H_ {gleich}} - {H_ {hell}} $$ Anzeige $$



Dementsprechend wird ein Punkt ausgewĂ€hlt, fĂŒr den die Änderung der Entropie maximal ist. Der Aufteilungsprozess stoppt, wenn die Entropie Null ist, was bedeutet, dass alle Punkte entweder singulĂ€r sind oder umgekehrt - alle sind nicht speziell. Bei einer Software-Implementierung wird der gefundene Entscheidungsbaum nach alledem in eine Reihe von Konstruktionen vom Typ "if-else" konvertiert.

Der letzte Schritt des Algorithmus ist die UnterdrĂŒckung von Nichtmaxima, um einen von mehreren benachbarten Punkten zu erhalten. Die Entwickler schlagen vor, das ursprĂŒngliche Maß basierend auf der Summe der absoluten Differenzen zwischen dem Mittelpunkt und den Punkten des Kreises in dieser Form zu verwenden:

$$ display $$ V = \ max \ left ({\ sum \ limit_ {x \ in {S_ {bright}}} {\ left | {{I_x} - {I_p}} \ right | - t, \ sum \ Limits_ {x \ in {S_ {dark}}} {\ left | {{I_p} - {I_x}} \ right | - t}}} \ right) $$ display $$



Hier $ inline $ {S_ {bright}} $ inline $ und $ inline $ {S_ {dark}} $ inline $ Gruppen von Pixeln sind heller und dunkler, t ist der Schwellenhelligkeitswert, $ inline $ {I_p} $ inline $ - Helligkeit des zentralen Pixels, $ inline $ {{I_x}} $ inline $ - Helligkeit des Pixels auf dem Kreis. Sie können den Algorithmus mit dem folgenden Code ausprobieren. Der Code wird aus OpenCV ĂŒbernommen und von allen AbhĂ€ngigkeiten befreit. FĂŒhren Sie ihn einfach aus.

Entscheidungsbaum optimieren - FAST-ER


FAST-ER [3] ist ein Algorithmus der gleichen Autoren wie der vorherige, ein schneller Detektor ist Àhnlich aufgebaut, die optimale Folge von Punkten wird ebenfalls zum Vergleich gesucht, ein Entscheidungsbaum wird ebenfalls erstellt, jedoch unter Verwendung einer anderen Methode - der Optimierungsmethode.

Wir verstehen bereits, dass ein Detektor als Entscheidungsbaum dargestellt werden kann. Wenn wir ein Kriterium zum Vergleichen der Leistung verschiedener BÀume hatten, können wir dieses Kriterium maximieren, indem wir verschiedene Baumvarianten sortieren. Als solches Kriterium wird vorgeschlagen, "Wiederholbarkeit" zu verwenden.

Die Wiederholbarkeit zeigt, wie gut die einzelnen Punkte einer Szene aus verschiedenen Winkeln erfasst werden. FĂŒr ein Paar von Bildern wird ein Punkt als "nĂŒtzlich" bezeichnet, wenn er auf einem Rahmen gefunden wird und theoretisch auf einem anderen gefunden werden kann, d. H. Blockieren Sie nicht die Elemente der Szene. Und der Punkt heißt "wiederholt" (wiederholt), wenn er auch im zweiten Frame gefunden wird. Da die Kameraoptik nicht ideal ist, befindet sich der Punkt auf dem zweiten Bild möglicherweise nicht im berechneten Pixel, sondern irgendwo in der NĂ€he. Die Entwickler nahmen eine Nachbarschaft von 5 Pixeln. Wir definieren Wiederholbarkeit als das VerhĂ€ltnis der Anzahl der wiederholten Punkte zur Anzahl der nĂŒtzlichen:

$$ Anzeige $$ R = \ frac {{{N_ {wiederholt}}}} {{{N_ {nĂŒtzlich}}} $$ Anzeige $$



Um den besten Detektor zu finden, wird eine Tempersimulationsmethode verwendet. Es gibt bereits einen ausgezeichneten Artikel ĂŒber HabrĂ© ĂŒber ihn. Kurz gesagt, das Wesentliche der Methode ist wie folgt:

  • Es wird eine erste Lösung fĂŒr das Problem ausgewĂ€hlt (in unserem Fall handelt es sich um eine Art Detektorbaum).
  • Wiederholbarkeit wird berĂŒcksichtigt.
  • Der Baum wird zufĂ€llig geĂ€ndert.
  • Wenn die modifizierte Version nach dem Kriterium der Wiederholbarkeit besser ist, wird die Modifikation akzeptiert, und wenn sie schlechter ist, kann sie mit einer gewissen Wahrscheinlichkeit, die von einer reellen Zahl namens "Temperatur" abhĂ€ngt, entweder akzeptiert werden oder nicht. Mit zunehmender Anzahl von Iterationen fĂ€llt die Temperatur auf Null.

Außerdem umfasst der Aufbau des Detektors jetzt nicht mehr wie zuvor 16 Punkte des Kreises, sondern 47, aber die Bedeutung Ă€ndert sich ĂŒberhaupt nicht:

Bild

Nach der simulierten GlĂŒhmethode definieren wir drei Funktionen:

‱ Kostenfunktion k. In unserem Fall verwenden wir die Wiederholbarkeit als Wert. Es gibt jedoch ein Problem. Stellen Sie sich vor, dass alle Punkte auf jedem der beiden Bilder als Singular erkannt werden. Dann stellt sich heraus, dass die Wiederholbarkeit 100% ist - AbsurditĂ€t. Auf der anderen Seite, auch wenn wir einen bestimmten Punkt in zwei Bildern gefunden haben und diese Punkte ĂŒbereinstimmen - die Wiederholbarkeit ist ebenfalls 100%, aber das interessiert uns auch nicht. Und deshalb schlugen die Autoren vor, dies als QualitĂ€tskriterium zu verwenden:

$$ display $$ k = \ left ({1 + {{\ left ({\ frac {{{w_r}}} {R}} \ right)} ^ 2}} \ right) \ left ({1 + \ frac {1} {N} \ sum \ limit_ {i = 1} {{{\ left ({\ frac {{{d_i}}} {{{w_n}}} right)} ^ 2}} \ rechts) \ links ({1 + {{\ links ({\ frac {s} {{{w_s}}}} rechts)} ^ 2}} \ rechts) $$ display $$



r ist die Wiederholbarkeit $ inline $ {{d_i}} $ inline $ Ist die Anzahl der erkannten Winkel auf Bild i, N ist die Anzahl der Bilder und s ist die GrĂ¶ĂŸe des Baums (Anzahl der Eckpunkte). W sind benutzerdefinierte Methodenparameter.]

‱ Funktion der TemperaturĂ€nderung ĂŒber die Zeit:

$$ display $$ T \ left (I \ right) = \ beta \ exp \ left ({- \ frac {{\ alpha I}} {{{I _ {\ max}}} \ right) $$ display $$



wo $ inline $ \ alpha, \ beta $ inline $ Sind die Koeffizienten, ist Imax die Anzahl der Iterationen.

‱ Eine Funktion, die eine neue Lösung generiert. Der Algorithmus nimmt zufĂ€llige Änderungen am Baum vor. WĂ€hlen Sie zunĂ€chst einen Scheitelpunkt aus. Wenn der ausgewĂ€hlte Scheitelpunkt ein Blatt eines Baumes ist, gehen wir mit gleicher Wahrscheinlichkeit wie folgt vor:

  1. Ersetzen Sie den Scheitelpunkt durch einen zufÀlligen Teilbaum mit der Tiefe 1
  2. Ändern Sie die Klasse dieses Blattes (Singular-Nicht-Singular-Punkte)

Wenn dies KEIN Blatt ist:

  1. Ersetzen Sie die Nummer des getesteten Punktes durch eine Zufallszahl von 0 bis 47
  2. Ersetzen Sie den Scheitelpunkt durch ein Blatt mit einer zufÀlligen Klasse
  3. Tauschen Sie zwei TeilbÀume von diesem Scheitelpunkt aus

Die Wahrscheinlichkeit P, die Änderung bei Iteration I zu akzeptieren, ist:
$ inline $ P = \ exp \ left ({\ frac {{k \ left ({i - 1} \ right) - k \ left (i \ right)}} {T}} \ right) $ inline $
k ist die Kostenfunktion, T ist die Temperatur, i ist die Iterationszahl.

Diese Änderungen am Baum ermöglichen sowohl das Wachstum des Baumes als auch dessen Reduzierung. Die Methode ist zufĂ€llig und garantiert nicht, dass der beste Baum erhalten wird. FĂŒhren Sie die Methode viele Male aus und wĂ€hlen Sie die beste Lösung aus. Im Originalartikel werden sie beispielsweise 100 Mal pro 100.000 Iterationen ausgefĂŒhrt, was 200 Stunden Prozessorzeit in Anspruch nimmt. Wie die Ergebnisse zeigen, ist das Ergebnis besser als Tree FAST, insbesondere bei verrauschten Bildern.

KURZER Deskriptor


Nachdem die singulÀren Punkte gefunden wurden, werden ihre Deskriptoren berechnet, d.h. SÀtze von Merkmalen, die die Nachbarschaft jedes einzelnen Punktes charakterisieren. BRIEF [4] ist ein schneller heuristischer Deskriptor, der aus 256 binÀren Vergleichen zwischen der Helligkeit der Pixel in einem verschwommenen Bild aufgebaut ist. Der binÀre Test zwischen den Punkten x und y ist wie folgt definiert:

$$ display $$ \ tau \ left ({P, x, y} \ right): = \ left \ {{\ begin {array} {* {20} {c}} {1: p \ left (x \ rechts) <p \ left (y \ right)} \\ {0: p \ left (x \ right) \ ge p \ left (y \ right)} \ end {array}} \ right. $$ display $$



Bild

Im ursprĂŒnglichen Artikel wurden verschiedene Methoden zur Auswahl von Punkten fĂŒr binĂ€re Vergleiche berĂŒcksichtigt. Wie sich herausstellte, besteht eine der besten Möglichkeiten darin, Punkte mithilfe einer Gaußschen Verteilung um ein zentrales Pixel zufĂ€llig auszuwĂ€hlen. Diese zufĂ€llige Folge von Punkten wird einmal ausgewĂ€hlt und Ă€ndert sich nicht weiter. Die GrĂ¶ĂŸe der betrachteten Nachbarschaft des Punktes betrĂ€gt 31 x 31 Pixel, und die UnschĂ€rfeöffnung betrĂ€gt 5.

Der resultierende binĂ€re Deskriptor ist resistent gegen Änderungen der Beleuchtung, perspektivische Verzerrungen, wird schnell berechnet und verglichen, ist jedoch sehr instabil gegenĂŒber Rotationen in der Bildebene.

ORB - schnell und effizient


Die Entwicklung all dieser Ideen war der ORB-Algorithmus (Oriented FAST and Rotated BRIEF) [5], bei dem versucht wurde, die BRIEF-Leistung wĂ€hrend der Bildrotation zu verbessern. Es wird vorgeschlagen, zuerst die Orientierung des Singularpunkts zu berechnen und dann binĂ€re Vergleiche gemĂ€ĂŸ dieser Orientierung durchzufĂŒhren. Der Algorithmus funktioniert folgendermaßen:

1) Feature-Punkte werden mithilfe des schnellen FAST-Baums im Originalbild und in mehreren Bildern aus der Miniaturpyramide erkannt.

2) FĂŒr die erkannten Punkte wird das Harris-Maß berechnet, Kandidaten mit einem niedrigen Wert des Harris-Maßes werden verworfen.

3) Der Orientierungswinkel des Singularpunktes wird berechnet. Dazu werden zunĂ€chst die Helligkeitsmomente fĂŒr die Nachbarschaft des Singularpunktes berechnet:

$ inline $ {m_ {pq}} = \ sum \ limit_ {x, y} {{x ^ p} {y ^ q} I \ left ({x, y} \ right)} $ inline $
x, y - Pixelkoordinaten, I - Helligkeit. Und dann der Orientierungswinkel des singulÀren Punktes:
$ inline $ \ theta = {\ rm {atan2}} \ left ({{m_ {01}}, {m_ {10}}} \ right) $ inline $

All dies nannten die Autoren die "Schwerpunktorientierung". Als Ergebnis erhalten wir eine bestimmte Richtung fĂŒr die Nachbarschaft des singulĂ€ren Punktes.

4) Mit dem Orientierungswinkel des Singularpunkts dreht sich die Folge von Punkten fĂŒr binĂ€re Vergleiche im BRIEF-Deskriptor entsprechend diesem Winkel, zum Beispiel:

Bild

Formal werden die neuen Positionen fĂŒr die binĂ€ren Testpunkte wie folgt berechnet:

$$ display $$ \ left ({\ begin {array} {* {20} {c}} {{x_i} '} \\ {{y_i}'} \ end {array}} \ right) = R \ left (\ theta \ right) \ cdot \ left ({\ begin {array} {* {20} {c}} {{x_i}} \\ {{y_i}} \ end {array}} \ right) $$ Anzeige $$



5) Basierend auf den empfangenen Punkten wird der BRIEF-BinÀrdeskriptor berechnet

Und das ist ... nicht alles! Es gibt ein weiteres interessantes Detail in ORB, das einer gesonderten ErlĂ€uterung bedarf. Tatsache ist, dass in dem Moment, in dem wir alle singulĂ€ren Punkte auf einen Nullwinkel „drehen“, die zufĂ€llige Auswahl von binĂ€ren Vergleichen im Deskriptor nicht mehr zufĂ€llig ist. Dies fĂŒhrt dazu, dass sich erstens einige binĂ€re Vergleiche als voneinander abhĂ€ngig herausstellen und zweitens ihr Durchschnitt nicht mehr gleich 0,5 ist (1 ist heller, 0 ist dunkler, wenn die Auswahl zufĂ€llig war, es war durchschnittlich 0,5). All dies verringert die FĂ€higkeit des Deskriptors, einzelne Punkte untereinander zu unterscheiden, erheblich.

Lösung - Sie mĂŒssen im Lernprozess die „richtigen“ BinĂ€rtests auswĂ€hlen. Diese Idee hat den gleichen Geschmack wie das Baumtraining fĂŒr den FAST-9-Algorithmus. Angenommen, wir haben bereits eine Reihe einzelner Punkte gefunden. BerĂŒcksichtigen Sie alle möglichen Optionen fĂŒr binĂ€re Tests. Wenn die Nachbarschaft 31 x 31 ist und der BinĂ€rtest ein Paar von 5 x 5 Teilmengen ist (aufgrund von UnschĂ€rfe), gibt es viele Optionen fĂŒr die Auswahl von N = (31-5) ^ 2. Der Suchalgorithmus fĂŒr "gute" Tests lautet wie folgt:

  1. Wir berechnen das Ergebnis aller Tests fĂŒr alle singulĂ€ren Punkte
  2. Ordnen Sie die gesamte Testreihe entsprechend ihrem Abstand vom Durchschnitt von 0,5 an
  3. Erstellen Sie eine Liste mit den ausgewÀhlten "guten" Tests. Rufen Sie die Liste R auf.
  4. FĂŒgen Sie den ersten Test aus dem sortierten Satz zu R hinzu
  5. Wir nehmen den nĂ€chsten Test und vergleichen ihn mit allen Tests in R. Wenn die Korrelation grĂ¶ĂŸer als der Schwellenwert ist, verwerfen wir den neuen Test, andernfalls fĂŒgen wir ihn hinzu.
  6. Wiederholen Sie Schritt 5, bis Sie die erforderliche Anzahl von Tests eingegeben haben.

Es stellt sich heraus, dass die Tests so ausgewÀhlt werden, dass einerseits der Durchschnittswert dieser Tests so nahe wie möglich bei 0,5 liegt, andererseits die Korrelation zwischen verschiedenen Tests minimal ist. Und das brauchen wir. Vergleichen Sie, wie es war und wie es wurde:

Bild

GlĂŒcklicherweise ist der ORB-Algorithmus in der OpenCV-Bibliothek in der Klasse cv :: ORB implementiert. Ich benutze Version 2.4.13. Der Klassenkonstruktor akzeptiert die folgenden Parameter:

nfeatures - maximale Anzahl von Einzelpunkten
scaleFactor - Multiplikator fĂŒr die Bildpyramide, mehr als eine. Wert 2 implementiert die klassische Pyramide.
Ebenen - die Anzahl der Ebenen in der Bildpyramide.
edgeThreshold - Die Anzahl der Pixel am Bildrand, an denen einzelne Punkte nicht erkannt werden.
firstLevel - lass Null.
WTA_K - Die Anzahl der Punkte, die fĂŒr ein Element des Deskriptors erforderlich sind. Wenn gleich 2, wird die Helligkeit von zwei zufĂ€llig ausgewĂ€hlten Pixeln verglichen. Dies ist, was benötigt wird.
scoreType - wenn 0, dann wird harris als Merkmalsmaß verwendet, andernfalls - das FAST-Maß (basierend auf der Summe der Module der Helligkeitsunterschiede an den Punkten des Kreises). Das FAST-Maß ist etwas weniger stabil, aber schneller.
patchSize - Die GrĂ¶ĂŸe der Nachbarschaft, aus der zufĂ€llige Pixel zum Vergleich ausgewĂ€hlt werden. Der Code sucht und vergleicht die einzelnen Punkte in zwei Bildern, "templ.bmp" und "img.bmp".

Code
cv::Mat img_object=cv::imread("templ.bmp", 0); std::vector<cv::KeyPoint> keypoints_object, keypoints_scene; cv::Mat descriptors_object, descriptors_scene; cv::ORB orb(500, 1.2, 4, 31, 0, 2, 0, 31); //    orb.detect(img_object, keypoints_object); orb.compute(img_object, keypoints_object, descriptors_object); //    cv::Mat img = cv::imread("img.bmp", 1); cv::Mat img_scene = cv::Mat(img.size(), CV_8UC1); orb.detect(img, keypoints_scene); orb.compute(img, keypoints_scene, descriptors_scene); cv::imshow("desrs", descriptors_scene); cvWaitKey(); int test[10]; for (int q = 0; q<10 ; q++) test[q]=descriptors_scene.data[q]; //-- matching descriptor vectors using FLANN matcher cv::BFMatcher matcher; std::vector<cv::DMatch> matches; cv::Mat img_matches; if(!descriptors_object.empty() && !descriptors_scene.empty()) { matcher.match (descriptors_object, descriptors_scene, matches); double max_dist = 0; double min_dist = 100; // calculation of max and min idstance between keypoints for( int i = 0; i < descriptors_object.rows; i++) { double dist = matches[i].distance; if( dist < min_dist ) min_dist = dist; if( dist > max_dist ) max_dist = dist; } //-- Draw only good matches (ie whose distance is less than 3*min_dist) std::vector< cv::DMatch >good_matches; for( int i = 0; i < descriptors_object.rows; i++ ) if( matches[i].distance < (max_dist/1.6) ) good_matches.push_back(matches[i]); cv::drawMatches(img_object, keypoints_object, img_scene, keypoints_scene, good_matches, img_matches, cv::Scalar::all(-1), cv::Scalar::all(-1), std::vector<char>(), cv::DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); } cv::imshow("match result", img_matches ); cv::waitKey(); return 0; 


Wenn jemand geholfen hat, die Essenz der Algorithmen zu verstehen, ist dies nicht umsonst. An alle Habr.

Referenzen:

1. ZusammenfĂŒhren von Punkten und Linien fĂŒr die Hochleistungsverfolgung
2. Maschinelles Lernen zur schnellen Kurvenerkennung
3. Schneller und besser: Ein Ansatz des maschinellen Lernens zur Eckenerkennung
4. KURZDARSTELLUNG: BinÀr robuste, unabhÀngige Elementarfunktionen
5. ORB: eine effiziente Alternative zu SIFT oder SURF

Source: https://habr.com/ru/post/de414459/


All Articles