OpenCV bietet keine RANSAC-Funktion an sich oder zumindest in einer Form, die Sie einfach aufrufen und damit erledigen können (z cv::ransac(...)
). Alle Funktionen/Methoden, die RANSAC verwenden können, haben ein entsprechendes Flag. Dies ist jedoch nicht immer nützlich, wenn Sie tatsächlich etwas anderes mit den Inlierern machen wollen, die RANSAC berechnet, nachdem Sie eine Homographie/Fundamentalmatrix berechnet haben, um zum Beispiel eine schöne Grafik in Octave oder ähnliche Software/Bibliothek der Punkte zu erstellen verbleibender Satz von gefilterten Treffern usw.OpenCV: So erhalten Sie mit Hilfe von findHomography()/findFundamental() und RANSAC
Nach dem Vergleich von zwei Bildern erhält man einen Vektor von Übereinstimmungen. Dazu gibt es natürlich zwei Sätze von Schlüsselpunkten (einen für jedes Bild), die beim Matching-Prozess verwendet wurden. Unter Verwendung von Übereinstimmungen und Schlüsselpunkten erzeugen wir zwei Vektoren von Punkten (z. B. cv::Point2f points
) und leiten diese an findHomography()
weiter. Von this und this Posts habe ich entdeckt, wie genau die Inliers mit einer Maske markiert werden, die wir an diese Funktion übergeben. Jede Zeile innerhalb der Maske bezieht sich auf einen Inlier/Ausreißer. Ich bin jedoch nicht in der Lage, herauszufinden, wie ich die Zeilenindexinformationen aus meinen zwei Punktmengen verwenden soll. Der Quellcode von OpenCV hat mich nicht zu weit gebracht. In findFundamental()
(ähnlich wie findHomography()
, wenn es um ihre Unterschrift und den Maskenteil geht), benutzen sie compressPoints()
, was irgendwie die zwei Sätze, die wir als Eingabe haben (Quell- und Zielpunkte), zu einem zusammenzufassen scheint. Während des Tests, um die Art der Maske zu bestimmen, habe ich 2 Sätze von Punkten (konvertierte cv::Keypoints
bis cv::Point2f
- ein Standardverfahren) versucht. Jeder Satz enthält 300 Punkte, also haben wir insgesamt 600 Punkte. Die zurückgegebene Maske enthält 300 Zeilen (Werte sind für dieses Thema nicht wichtig).
EDIT: Während ich dies schrieb, entdeckte ich die Antwort (siehe unten), entschied mich aber diese Frage trotzdem zu posten, falls jemand diese Information so schnell wie möglich und in kompakter Form benötigt. Beachten Sie, dass wir noch eine OpenCV-Funktion benötigen, die RANSAC unterstützt. Also, wenn Sie eine Reihe von Punkten, aber keine Absicht haben, Homographie oder fundamentale Matrix zu berechnen, ist dies offensichtlich nicht der Weg und ich wage zu sagen, dass ich nichts Nützliches in OpenCVs API finden konnte, das helfen kann, dieses Hindernis zu umgehen, das Sie verwenden müssen eine externe Bibliothek.
Für den ersten Satz tatsächlich die Zeile in der Maske repräsentiert nicht ein Inlier. Die Zeile repräsentiert den Status von Inlier oder Ausreißer. Weitere Informationen finden Sie in diesem Beitrag [link] (http://stackoverflow.com/questions/15815304/opencv-c-findhomography-mask-values-meaning). –
Ja, das ist richtig und das ist es, was ich meinte, aber jetzt, wo ich diesen Satz noch einmal durchgelesen habe, sehe ich, wie er falsch interpretiert werden kann. Ich werde es ändern. – rbaleksandar
Aber row repräsentiert den Status von inlier oder outliers, aber es gibt keinen Schlüsselpunkt für jeden inlier- oder outliers-Status. Schlüsselpunkte werden im Vektor gespeichert. also wie können wir den entsprechenden schlüsselpunkt von inlier in maske bekommen? – Abc