2017-11-18 2 views
0

Ich habe ein Problem beim Versuch, perspectiveTransform() zu bekommen, um Ergebnisse zu erzielen, die ich verstehen kann.opencv perspectiveTransform produziert falsche Transformation trotz guter Homographie inliers

Ich schreibe eine Bild-Matching-Anwendung. Die meisten dieser Bilder sind Gemälde. Was ich zusammenfüge, ist ganz, ganz, ganz, ganz oder teilweise. Die Beschlüsse werden anders sein. Aufgrund dieser Beziehung passt die typischerweise verwendete Terminologie "Objekt" "Szene" nicht. Weil das Objekt tatsächlich die Szene sein kann und umgekehrt. Also benutze ich query image und indexiertes Zielbild, um die Abfrage und das Bild, mit dem ich übereinstimme, zu beschreiben.

Ich habe verschiedene OpenCV Tutorials verfolgt, um ein Bild mit einem anderen zu vergleichen und dann mit dem perspektivenTransform eine Bounding Box auf das identifizierte Bild zu setzen ... aber ich habe Probleme.

Image 1 - Whole-Part - Result of image matching: The query image (left), target pre-indexed img (right)

Im Bild hat dieses Bild wir Ich habe einen Teil-Ganzes-Beziehung sehen kann. Die Bilder wurden auf die maximale Kante 1000 skaliert und als Teil des SIFT-Prozesses, der dies ausgeführt hat, in Graustufen umgewandelt.

Query image dimensions x=1000, y=750 
Idx image dimensions x=667, y=1000 

Initial Flann matches: 501 
After Lowe's 2nd nn ratio: 48 matches 
RANSAC inliers: 37 matches 

Der Code ..

homography = Calib3d.findHomography(idxMatOfPoint2f, queryMatOfPoint2f, Calib3d.RANSAC, 5, mask, 2000, 0.995); 
Mat query_corners = new Mat(4, 1, CvType.CV_32FC2); 
Mat idx_corners = new Mat(4, 1, CvType.CV_32FC2); 


query_corners.put(0, 0, new double[]{0, 0}); 
query_corners.put(1, 0, new double[]{queryImage.cols() - 1, 0}); 
query_corners.put(2, 0, new double[]{queryImage.cols() - 1, queryImage.rows() - 1}); 
query_corners.put(3, 0, new double[]{0, queryImage.rows() - 1}); 

Core.perspectiveTransform(query_corners, idx_corners, homography); 

Das Ergebnis dieser Code gibt die folgenden Daten (original x, y: transformierte x, y)

Corners - Top-left = 0.0,0.0 : 163.84683227539062,167.56898498535156 
Corners - Top-right = 999.0,0.0 : 478.38623046875,169.61349487304688 
Corners - Bot-right = 999.0,749.0 : 491.45220947265625,411.24688720703125 
Corners - Bot-left = 0.0,749.0 : 162.11233520507812,411.5089416503906 

nun klar die Punkte gezeichnetes Bild ist falsch - aber zu wählen, auf was zu zeichnen bedeutet, habe ich bereits festgestellt. Was ich jedoch seltsam finde, ist, dass die Box die gesamte Größe des Abfragebilds hat, das in den Raum des zweiten Bildes transformiert wird. Ich habe nicht erwartet, dass die Box in Größe und Form auf eine Weise reduziert wird, die nicht einmal mit dem ersten Bild übereinstimmt.

Die transformierten x, y ergeben einfach keinen Sinn für mich. Kann jemand bitte etwas Licht darauf werfen?

Image 2 - Part-Whole - Result of image matching: The query image (left), target pre-indexed img (right)

bei Bild Blick 2, wo die Abfrage ein Teil ist und die ganze das Ziel idx Bild ergibt:

Initial Flann matches: 500 
After Lowe's 2nd nn ratio: 21 
RANSAC inliers: 17 

query image dimensions x=1000, y=750 
idx image dimensions x=1000, y=609 

Corners - Top-left = 0.0,0.0 : -1228.55224609375,-923.1514282226562 
Corners - Top-right = 999.0,0.0 : 3561.064453125,-930.8649291992188 
Corners - Bot-right = 999.0,749.0 : 2768.0224609375,1934.417236328125 
Corners - Bot-left = 0.0,749.0 : -699.1375732421875,2089.652587890625 

Auch dies macht nur absolut keinen Sinn für mich. -1228? Aber beide Bilder sind nur 1000 across und die Abfrage ist vollständig in dem Ziel-IDX-Bild enthalten.

Dieses letzte Bild zeigt die Frustration in diesem. Image 3 - Whole-Whole Hier können wir sehen, dass perspektivisch transformierte Ecken einfach weg sind - es ist tatsächlich kleiner als das Bild, zu dem es passt ... Es scheint, dass die perspektivische Transformationsfunktion fast zufällige Ergebnisse liefert.

Kann jemand erkennen, was ich falsch mache? Verstecke ich die perspektivische Transformation falsch?

+0

können Sie versuchen homography = Calib3d.findHomography (queryMatOfPoint2f, idxMatOfPoint2f, Calib3d.RANSAC, 5, Maske, 2000, 0.995) ;? (andere Reihenfolge der Abfrage/idx) – Micka

+0

aha. Guter Punkt. Seltsam, dass ich es so herum habe - ich versuche es andersherum. – barryp

+0

nicht sicher, welche Reihenfolge richtig ist, aber das ist eine häufige Fehlerquelle: D – Micka

Antwort

1

Dank Micka ... Die Antwort für das Problem in der PerspektiveTransform() ist, weil die Abfrage und vorindizierten Bildpunkte im Funktionsaufruf vertauscht wurden. Der folgende Aufruf gibt das korrekte Ergebnis für ein übereinstimmendes Bild an.

homografie = Calib3d.findHomography (queryMatOfPoint2f, idxMatOfPoint2f, Calib3d.RANSAC, 5, Maske, 2000, 0.995);

Die Homographie lässt jedoch eine merkwürdige Menge von Übereinstimmungen durch, die nicht erlaubt sein sollten. Ich poste ein neues Q, da die perspektivische Transformation nun gelöst ist.

Verwandte Themen