2012-06-11 14 views
6

Ich möchte ein virtuelles Objekt bei x, y, z Metern und Kamera vergrößern. OpenCV hat Kamerakalibrierungsfunktionen, aber ich verstehe nicht, wie genau ich Koordinaten in Metern geben kannWie findet man die Kameramatrix für Augmented Reality?

Ich habe versucht, eine Kamera in Unity zu simulieren, aber nicht erwartetes Ergebnis.

Ich setze die Projektionsmatrix wie folgt und erstelle einen Einheitswürfel bei z = 2.415 + 0.5. Wobei 2,415 der Abstand zwischen dem Auge und der Projektionsebene ist (Lochkamera-Modell) Da sich das Gesicht des Würfels an der vorderen Schnittebene befindet und seine Dimension Einheit ist, sollte es nicht das gesamte Ansichtsfenster abdecken?

Matrix4x4 m = new Matrix4x4(); 
    m[0, 0] = 1; 
    m[0, 1] = 0; 
    m[0, 2] = 0; 
    m[0, 3] = 0; 

    m[1, 0] = 0; 
    m[1, 1] = 1; 
    m[1, 2] = 0; 
    m[1, 3] = 0; 

m[2, 0] = 0; 
    m[2, 1] = 0; 
    m[2, 2] = -0.01f; 
    m[2, 3] = 0; 

    m[3, 0] = 0; 
    m[3, 1] = 0; 
    m[3, 2] = -2.415f; 
    m[3, 3] = 0; 
+0

Wenn Sie m [3,2] = -1/2.415f und m [3,3] = 1 Projektionsmatrix richtig funktioniert –

Antwort

4

Ich habe das Gesichtsfeld manuell gemessen. Sobald Sie FOV kennen, können Sie einfach die Projektionsmatrix erstellen. Sie müssen sich keine Sorgen um die Einheiten machen, denn am Ende hat die Projektion die Form (X * d/Z, Y * d/Z). Was auch immer die Einheiten von X, Y, Z sein mögen, das Verhältnis von X/Z bleibt gleich.

5

Die globalen Maßstab Ihrer Kalibrierung (das heißt die Maßeinheiten der 3D-Raumkoordinaten) wird durch die Geometrie des Kalibrierkörpers Sie verwenden bestimmt. Wenn Sie beispielsweise in OpenCV mit Bildern eines flachen Schachbretts kalibrieren, sind die Eingaben für die Kalibrierungsprozedur entsprechende Paare (P, p) von 3D-Punkten P und ihre Bilder p, die (X, Y, Z) -Koordinaten des 3D Die Punkte werden in mm, cm, Zoll, Meilen usw. ausgedrückt, je nach der Größe des von Ihnen verwendeten Ziels (und der Optik, die es abbildet), und die 2D-Koordinaten der Bilder sind in Pixeln angegeben. Die Ausgabe der Kalibrierungsroutine ist der Satz von Parametern (die Komponenten der Projektionsmatrix P und der nichtlinearen Verzerrungsparameter k), die in diesen metrischen Einheiten ausgedrückte 3D-Koordinaten in Pixel "umwandeln".

Wenn Sie die tatsächlichen Abmessungen des Kalibrierungsziels nicht kennen (oder nicht verwenden möchten), können Sie sie einfach täuschen, aber ihre Verhältnisse unverändert lassen (so dass beispielsweise ein Quadrat ein Quadrat bleibt) obwohl die wahre Länge seiner Seite unbekannt sein kann). In diesem Fall wird Ihre Kalibrierung bis zu einer unbekannten globalen Skala bestimmt. Dies ist eigentlich der gängige Fall: In den meisten Virtual-Reality-Anwendungen interessiert es Sie nicht, was die globale Skala ist, solange die Ergebnisse im Bild korrekt aussehen.

Zum Beispiel, wenn Sie ein noch puffigeres Paar 3D-Lippen auf einem Video von Angelina Jolie hinzufügen und mit dem Original-Video zusammenfügen möchten, so dass die brandneuen falschen Lippen haften bleiben und "natürlich" auf ihrem Gesicht aussehen Sie müssen nur das 3D-Modell der falschen Lippen neu skalieren, so dass es das Bild der Lippen korrekt überlappt. Ob das Modell 1 Yard oder 1 Meile von der CG-Kamera entfernt ist, in der Sie das Composite rendern, ist völlig irrelevant.

+1

Ich mag das Beispiel :) – Ani

+1

Ich bin in der Lage, Modelle ohne ordnungsgemäße Skalierung aber ich zu erweitern will es genau in Metern sein. Ich werde Stereo-Rendering machen und es muss genaue Tiefenwahrnehmung geben. –

+0

Auch im Stereo-Rendering-Fall ist die metrische Genauigkeit irrelevant: In diesem Fall ist es nur wichtig, dass die beiden Kameras mit der richtigen Links-Rechts-Disparität wiedergegeben werden. Solange alle Größen- und Abstandsverhältnisse korrekt sind, kann der tatsächliche globale Maßstab nicht wahrgenommen werden. –

5

Um herauszufinden, ob ein Objekt vergrößert werden soll, müssen Sie die Pose und Ausrichtung der Kamera finden. Das ist dasselbe wie das Finden der Extrinsik der Kamera. Sie müssen auch zuerst die Kamera-Intrinsics berechnen (was calibraiton heißt).

Mit OpenCV können Sie all dies tun, aber es ist nicht trivial, es erfordert eigene Arbeit. Ich gebe dir einen Hinweis, du musst zuerst etwas in der Szene erkennen, von dem du weißt, wie es aussieht, also kannst du die Kamera-Pose berechnen, indem du dieses Objekt analysierst und es als Marker nennst. Sie können mit den typischen Referenzpunkten beginnen, sie sind leicht zu erkennen.

Werfen Sie einen Blick auf diese thread.