2012-04-07 2 views
3

In OpenCV für Android gibt die Funktion org.opencv.Calib3d.findHomography (..) die homogene Transformationsmatrix zurück. Zum Beispiel, geben diese nur die Homografie:Die von RANSAC verwendeten 5 Punkte in findHomography (OpenCV für Android)

Mat homography = Calib3d.findHomography(points1, points2, Calib3d.RANSAC, 0.5); 

Gibt es eine Möglichkeit, die Punkte zurück, die RANSAC tatsächlich aus dem Android OpenCV-API verwendet?

Antwort

8

aktualisieren

Ich bin nicht sicher, ob es eine neue Ergänzung zu OpenCV ist oder ich habe es nur knapp verfehlt, aber die findHomography() Funktion können Sie tatsächlich geben den inliers (OpenCV 2.4.2). Der letzte Parameter, mask, der standardmäßig leer ist, wird mit Einsen (oder 255) an den Indizes der durch RANSAC definierten Inliers gefüllt.

Mat findHomography(InputArray srcPoints, InputArray dstPoints, 
    int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray()) 
//                ^
//                | 

Alte Antwort

Die von RANSAC verwendet Punkte, um den Homografie (genannt inliers in technischen Dokumenten) schätzen können nicht direkt extrahiert werden. Sie werden intern berechnet, aber dann wird die Liste gelöscht.

Eine Möglichkeit, sie zu extrahieren, besteht darin, die Funktion findHomography (und die entsprechenden RANSAC-Funktionen) zu ändern. Aber das ist hässlich.

Ein weiterer, sauberer Weg ist, welche Punktpaare in dem Eingangsspiel th Homografie zu testen:

verwenden die projectPoints(points1, homography, points1_dest) (ich hoffe, dass dies der Name der Funktion ist) Homografie gelten Punkte1. Verwenden Sie cv::distance(points1_dest, points2), um zu sehen, welche von ihnen nahe genug an ihrem Paar in points2 sind. Der Abstand sollte kleiner oder gleich min_distance^2 sein. In Ihrem Fall 0.5*0.5 = 0.25.

+0

Das ist ein guter Workaround! –

+0

Und wenn direkt RANSAC Code ändern, wo wäre genau der Ort, um die verwendeten Punkte zu speichern? Würde es innerhalb der Schleife sein if (goodCount> MAX (maxGoodCount, modelPoints-1)) {} ??? Also an diesem Punkt speichern Sie die Werte von ms1 und ms2? –

Verwandte Themen