2014-11-24 8 views
6

Ich möchte Tiefeninformationen aus 2 Bildern einer beweglichen Kamera berechnen. Unter Verwendung von Sensor.TYPE_ROTATION_VECTOR habe ich Quaternionen für beide Bilder sowie das relative Quaternoin von Img1 bis Img2.Rotierendes Bild von den Daten des Orientierungssensors

Img1

enter image description here

q1 = 0.7545 - 0.1137i - 0.2715j - 0.5865k 

Img2

enter image description here

q2 = 0.7706 - 0.2252i - 0.3511j - 0.4817k 

und relative quaternoin ist:

qr = -0.9850 + 0.0072i + 0.1329j - 0.1097k 

Das heißt, die relative Drehmatrix ist,

|0.9406 -0.2142 -0.2635 | 
|0.2180 0.9758 -0.0150 | 
|0.2604 -0.0433  0.9645 | 

Ist das die Matrix getPerspectiveTransform gibt?

Wenn ich diese 3x3 Rotationsmatrix in warpPerspective verwende, bekomme ich ein fast leeres Bild, abgesehen von etwas in der linken oberen Ecke. (Vielleicht ist die Achse, um die das Bild gedreht wird, falsch).

enter image description here

Was mache ich falsch?

Hinweis: Es gibt eine kleine Übersetzung als auch zwischen den zwei Bildern (Leider über die schlechten Bilder)

Edit 1: Nach diesem link, für meine Moto G 2nd Generation, erhalte ich eine intrinsische Kameramatrix wie

K = |-3570 0   1632 | 
    | 0 3554.39 1218.65| 
    | 0  0   1 | 
+0

Von dem, was ich bis jetzt verstehe, muss ich "Bildentzerrung" dafür machen. Irgendwelche Ideen, wie man es mit den verfügbaren Informationen macht? – harsh

Antwort

2

Wenn ich richtig verstehe, haben Sie zwei Bilder von einer Smartphone-Kamera aufgenommen, für die Sie wissen (zumindest ungefähr) die Spezifika Matrix und die relative 3D-Rotation zwischen den Posen, wo th Die zwei Bilder wurden aufgenommen. Sie sagen auch, dass es eine kleine Übersetzung zwischen den beiden Bildern gibt, was gut ist, da Sie ansonsten keine Tiefe hätten berechnen können.

Leider haben Sie nicht genügend Informationen, um die Tiefe direkt abschätzen zu können. Im Grunde genommen aus zwei Bildern Schätzen Tiefe erfordert:

1. Finden Punktkorrespondenzen zwischen den beiden Bildern

Je was Sie tun möchten, können dies entweder für alle Punkte in den Bildern durchgeführt werden (dh in ein dichter Weg) oder nur für wenige Punkte (dh spärlich). Letzteres ist natürlich weniger rechenintensiv und daher für Smartphones besser geeignet.

  • Dense Anpassung erfordert die Bilder zu korrigieren, um die Berechnung gefügig zu machen, aber das wird wohl eine lange Zeit in Anspruch nehmen, wenn sie auf einem Smartphone ausgeführt.Die Bildentzerrung kann entweder unter Verwendung einer kalibrierten Methode (die die Rotation + Translation zwischen den beiden Positionen der Bilder, der intrinsischen Kameramatrix und der Verzerrungskoeffizienten der Kamera kennt) oder einer nicht kalibrierten Methode (die wissen muss) erreicht werden spärliche Punktübereinstimmungen zwischen den beiden Bildern und der Grundmatrix, die aus den Übereinstimmungen abgeschätzt werden kann).

  • Spärliches Matching erfordert, dass wichtige Merkmale (z. B. SURFs oder SIFTs oder effizientere) zwischen den beiden Bildern gefunden werden. Dies hat den Vorteil, effizienter zu sein als eine dichte Anpassung und auch genauer.

2. die entsprechenden Punkte Triangulate Tiefe abzuschätzen

Triangulation den Spezifika-Parameter (Kameramatrix und Verzerrungskoeffizienten) und den extrinsischen Parameter (relative Rotation und Translation zwischen den Posen zu wissen, erfordert zu bilden, die die Bilder wurden aufgenommen).


In Ihrem Fall Ihre relative Drehung und Spezifika Kameramatrix genau genug sind unter der Annahme, (was ich bezweifle), fehlen Sie noch die Übersetzung und die Verzerrungskoeffizienten.

Sie können jedoch immer noch den klassischen Ansatz für Stereo-Triangulation anwenden, die eine genaue Kalibrierung Ihrer Kamera und eine Schätzung der vollständigen relativen Pose (d. H. Rotation + Translation) erfordern.

Mit der Kalibrierung Ihrer Kamera können Sie eine genaue intrinsische Matrix und die zugehörigen Verzerrungskoeffizienten abschätzen. Dies ist empfehlenswert, weil Ihre Kamera nicht genau mit den Kameras anderer Telefone übereinstimmt (auch wenn es sich um das gleiche Telefonmodell handelt). Siehe z.B. this tutorial, die die Methode zeigt, obwohl die Codebeispiele in C++ sind (das Äquivalent muss für Android existieren).

Sobald Sie genau die Spezifika-Parameter geschätzt haben, eine Möglichkeit, die volle relative Pose (dh Rotation und Translation) zu schätzen ist die Fundamental-Matrix zu berechnen (Spiele, indem zwischen den beiden Bildern zu finden), dann die zu folgern essentielle Matrix unter Verwendung der Kameramatrix und schließlich zum Zerlegen der wesentlichen Matrix in die relative Rotation und Translation. Siehe this link, die die Formel zum Ableiten der wesentlichen Matrix aus der Grundmatrix und this link, die erklären, wie die Rotation und Translation aus der essentiellen Matrix zu berechnen, gibt.


, auch Ihre andere Frage zu warpPerspective zu beantworten, Sie K.R.inv(K) oder K.inv(R).inv(K) je nach Bild, das Sie Verziehen verwenden müßten. Dies liegt daran, R ist eine 3D-Rotation, die nichts mit Pixel-Koordinaten zu tun hat.