OpenCV: Wie man inlier Punkte mit findHomography()/findFundamental() und RANSAC
OpenCV bietet keine RANSAC-Funktion per se oder zumindest in einer solchen form, dass Sie können einfach rufen und mit ihm getan werden (z.B. cv::ransac(...)
). Alle Funktionen/Methoden, die in der Lage sind zu verwenden, RANSAC, eine Flagge, die es ermöglicht. Dies ist jedoch nicht immer sinnvoll, wenn Sie wirklich wollen, um etwas anderes zu tun, mit der inliers RANSAC berechnet nach haben Sie geschätzt, ein homography/grundlegende matrix für das Beispiel erstellen Sie ein schönes Grundstück in Oktav-oder ähnliche software/Bibliothek der Punkte, zusätzliche algorithmen, die auf der restlichen Menge des gefilterten Spiele etc.
Nach dem matching in zwei Bildern erhält man einen Vektor, der die Spiele. Zusammen mit, dass haben wir natürlich 2 paar Eckdaten (einer für jedes Bild), die verwendet wurden, in den matching-Prozess. Spiele und Eckdaten erstellen wir zwei Vektoren der Punkte (z.B. cv::Point2f points
) und übergeben Sie diese zu findHomography()
. Von diese und diese Beiträge habe ich entdeckt, wie genau die inliers sind gekennzeichnet mit einer Maske, die wir passieren, um auf die Funktion. Jede Zeile innerhalb der Maske bezieht sich auf eine inlier/Ausreißer. Aber ich bin nicht in der Lage, um herauszufinden, wie man den row-index-Informationen aus meinen zwei Sätzen von Punkten. Auf der Suche im OpenCV source code hat mich nicht zu weit. In findFundamental()
(ähnlich findHomography()
wenn es um seine Unterschrift und die Maske-Teil) verwenden Sie compressPoints()
, das scheint irgendwie kombinieren Sie die zwei Sätze haben wir als Eingabe - (Quell-und Ziel-Punkte) in einem. Während des Tests, um zu bestimmen, die Art der Maske, die ich habe versucht, 2 sets von aufeinander abgestimmten Punkte (Umgerechnet cv::Keypoints
zu cv::Point2f
- ein standard-Verfahren). Jedes set enthält 300 Punkte also insgesamt haben wir 600 Punkte. Die zurückgegebenen Maske enthält 300 Zeilen (Werte sind nicht wichtig für dieses Thema bei der hand).
EDIT: Beim schreiben dieses entdeckte ich die Antwort (siehe unten), aber beschlossen, an Stelle diese Frage trotzdem, falls jemand braucht diese Informationen so bald wie möglich und in kompakter form. Beachten Sie, dass wir noch einen brauchen der OpenCV - Funktion, die Unterstützung von RANSAC. Also, wenn Sie haben eine Reihe von Punkten, aber nicht die Absicht computing homography oder grundlegende matrix, das ist natürlich nicht die Art und Weise, und ich wage zu sagen, dass ich nicht in der Lage war zu finden, alles, was nützlich in OpenCV API, die helfen können, vermeiden Sie dieses Hindernis daher müssen Sie verwenden eine externe Bibliothek.
InformationsquelleAutor rbaleksandar | 2014-06-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lösung ist eigentlich Recht trivial. Wie wir wissen, jede Zeile in unsere Maske gibt Auskunft, wenn wir einen inlier oder ein Ausreißer. Aber wir haben 2 Mengen von Punkten als Eingabe, so wie genau funktioniert eine Zeile mit einem einzelnen Wert repräsentieren zwei Punkte? Die Natur dieser Art der Indizierung erschien in meinem Kopf, während Sie denken, wie eigentlich diese zwei Sätze von Punkte erscheinen in findHomography() (in meinem Fall war ich der Berechnung der homography zwischen zwei Bildern). Beide Sätze haben die gleiche Anzahl von Punkten, die in Ihnen aufgrund der einfachen Tatsache, dass Sie extrahiert aus den Begegnungen zwischen unseren paar Bilder. Dies bedeutet, dass eine Zeile in unsere Maske ist der index der Punkte in den zwei Sätzen, und auch der index in dem Vektor, der die übereinstimmungen der beiden Bilder. Ich habe erfolgreich geschafft, manuell beziehen sich auf eine kleine Teilmenge der gefundenen Punkte auf dieser Grundlage die Ergebnisse wie erwartet sind. Es ist wichtig, dass Sie nicht ändern Sie die Reihenfolge der Spiele und die 2D-Punkte, die Sie extrahiert haben, indem Sie die Eckdaten verwiesen, die in jeder
cv::DMatch
. Unten sehen Sie ein einfaches Beispiel für ein einzelnes paar von inliers.In dem obigen Beispiel, wenn wir drucken einige inlier
dann wieder, aber dieses mal mit unseren Eckdaten (kann auch durchgeführt werden, die mit den extrahierten 2D-Punkte)
wir bekommen tatsächlich die gleiche Ausgabe:
Wird die tatsächliche inlier wir haben einfach zu überprüfen, ob die aktuelle Zeile in der Maske enthält tatsächlich eine 0 oder nicht-null-Wert:
Ja, das ist richtig und das ist was ich meinte aber jetzt, dass ich wieder Lesen Sie diesen Satz, den ich sehen, wie es fehlinterpretiert werden kann. Ich werde es ändern.
Aber Zeile stellt den status der inlier oder Ausreißer, aber es ist kein wesentlicher Punkt auf jeder inlier oder Ausreißer-status. Eckdaten gespeichert, im Vektor. also wie kann man die entsprechenden Schlüssel-Punkt der inlier in der Maske?
Ich habe eine wirklich schwierige Zeit zu verstehen, was Sie Fragen. Vielleicht können Sie einfach eine neue Frage (wenn Sie möchten, können Sie einen link um mir zu helfen, das Publikum sich ein besseres Bild von Ihrem Fall)?
InformationsquelleAutor rbaleksandar
Auf einer anderen Anmerkung. Es kann nicht möglich sein, RANSAC, um zu existieren, eine Funktion durch sich selbst in OpenCV, weil RANSAC ist eine abstrakte Technik, Zurückweisung von Ausreißern. RANSAC setzt auf ein Basis-Modell für die Durchführung der Ausreißer-Ablehnung. Jetzt ist das Basis-Modell ist sehr allgemein gehalten. Es könnte alles sein (nicht unbedingt Punkte, die eine Beziehung untereinander). Dies könnte der Grund sein, warum RANSAC existiert nur als eine Funktion in anderen Funktionen, die zum ausführen einiger Aufgaben definiert, die einen festgelegten Umfang wie
findHomography
,findFundamentalMat
usw.InformationsquelleAutor Arun Kumar