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.
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?
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?
können Sie versuchen homography = Calib3d.findHomography (queryMatOfPoint2f, idxMatOfPoint2f, Calib3d.RANSAC, 5, Maske, 2000, 0.995) ;? (andere Reihenfolge der Abfrage/idx) – Micka
aha. Guter Punkt. Seltsam, dass ich es so herum habe - ich versuche es andersherum. – barryp
nicht sicher, welche Reihenfolge richtig ist, aber das ist eine häufige Fehlerquelle: D – Micka