Ich beschäftige mich schon seit einiger Zeit mit der Schätzung der Kameraposition für Augmented Reality- und Visual Tracking-Anwendungen und denke, dass es trotz vieler detaillierter Informationen zu dieser Aufgabe immer noch viele Verwirrungen und Missverständnisse gibt.
Ich denke, die nächsten Fragen verdienen eine detaillierte schrittweise Antwort.
- Was sind Kameraeigenschaften?
- Was sind Kameraextrinsiken?
- Wie berechne ich Homographie von einem planaren Marker?
- Wenn ich Homografie habe, wie kann ich die Kamerapose bekommen?
Antworten:
Es ist wichtig zu verstehen, dass das einzige Problem hier darin besteht, die extrinsischen Parameter zu erhalten. Die Kameraeigenschaften können offline gemessen werden, und es gibt viele Anwendungen für diesen Zweck.
Was sind Kameraeigenschaften?
Kameraeigene Parameter werden üblicherweise als Kamerakalibrierungsmatrix . Wir können schreibenK
woher
& agr; v u v f α u = k u f α v = k v f k u k v u vαu und sind der Skalierungsfaktor in und Koordinatenrichtung und proportional zur Brennweite der Kamera: und . und sind die Anzahl der Pixel pro Abstandseinheit in und Richtung.αv u v f αu=kuf αv=kvf ku kv u v
u vs ist der Versatz, nur ungleich Null, wenn und nicht senkrecht sind.u v
Eine Kamera wird kalibriert, wenn ihre Eigenschaften bekannt sind. Dies ist einfach zu bewerkstelligen, sodass es in der Bildverarbeitung nicht als Ziel, sondern als Offline-Trivialschritt betrachtet wird.
Einige Links:
ftp://svr-ftp.eng.cam.ac.uk/pub/reports/mendonca_self-calibration.pdf
Was sind Kameraextrinsiken?
Kameraextrinsik oder externe Parameter ist eine Matrix, die der euklidischen Transformation von einem Weltkoordinatensystem in das Kamerakoordinatensystem entspricht. repräsentiert eine Rotationsmatrix und eine Translation.3 × 4 R 3 × 3 t[R|t] 3×4 R 3×3 t
Computer-Vision-Anwendungen konzentrieren sich auf die Schätzung dieser Matrix.
Wie berechne ich Homographie von einem planaren Marker?
Homographie ist eine homogene Matrix, die eine 3D-Ebene und ihre Bildprojektion in Beziehung setzt. Wenn wir ein Flugzeug haben die Homographie , die einen Punkt abbildet on zu dieser Ebene und den entsprechenden 2D - Punkt unter dem Projektions ist3×3 Z=0 H M=(X,Y,0)T m P=K[R|t]
Um Homographie berechnen zu können, benötigen wir Punktpaare Welt-Kamera. Wenn wir eine planare Markierung haben, können wir ein Bild davon verarbeiten, um Merkmale zu extrahieren und diese Merkmale in der Szene zu erkennen, um Übereinstimmungen zu erhalten.
Wir brauchen nur 4 Paare, um die Homographie mit Direct Linear Transform zu berechnen.
Wenn ich Homografie habe, wie kann ich die Kamerapose bekommen?
Die Homographie und die Kamerapose enthalten die gleichen Informationen, und es ist leicht, von einer zur anderen zu gelangen. Die letzte Spalte von beiden ist der Translationsvektor. Spalte eins und zwei der Homographie sind auch Spalte eins und zwei der Kamerapositionsmatrix. Es ist nur die dritte Spalte von übrig , und da es orthogonal sein muss, kann es als Kreuzprodukt der ersten und zweiten Spalte berechnet werden:H K[R|t] H1 H2 R1 R2 R3 [R|t]
Aufgrund der Redundanz ist es erforderlich, die -Division durch beispielsweise Element [3,4] der Matrix zu normalisieren .[R|t]
quelle
Während der zweidimensionale Fall sehr gut erklärt wird, bietet die von Jav_Rock vorgeschlagene Antwort keine gültige Lösung für Kameraposen im dreidimensionalen Raum. Beachten Sie, dass für dieses Problem mehrere mögliche Lösungen existieren.
Dieses Papier enthält geschlossene Formeln zur Zerlegung der Homographie, die Formeln sind jedoch etwas komplex.
OpenCV 3 implementiert bereits genau diese Zerlegung ( decomposeHomographyMat ). Bei einer gegebenen Homographie und einer korrekt skalierten intrinsischen Matrix bietet die Funktion einen Satz von vier möglichen Rotationen und Verschiebungen.
Die intrinsische Matrix muss in diesem Fall in Pixeleinheiten angegeben werden, dh Ihr Hauptpunkt ist normalerweise
(imageWidth / 2, imageHeight / 2)
und Ihre Brennweite ist normalerweisefocalLengthInMM / sensorWidthInMM * imageHeight
.quelle
focalLengthInMM / sensorWidthInMM * imageWidth
? Warum wählen Sie stattdessen die Höhe?