Ich versuche eine statische Augmented-Reality-Szene über einem Foto mit 4 definierten Übereinstimmungen zwischen koplanaren Punkten in einer Ebene und einem Bild zu erstellen.
Hier ist ein Schritt für Schritt:
Ich habe auch die Position der iPhone-Kamera relativ zur Mitte des A4-Papiers gemessen. Für diese Aufnahme wurde also die Position (0, 14, 42.5) in cm gemessen. Auch mein iPhone war leicht auf den Tisch (5-10 Grad)
Mit diesen Daten habe ich SCNCamera
eingerichtet, um die gewünschte Perspektive der blauen Ebene auf dem dritten Bild zu erhalten:
Dies gibt mir einen Bezug, um mein Ergebnis mit zu vergleichen.
Um AR mit SceneKit zu erstellen, muss ich:
H - Homographie; K - Intrinsische Matrix; [R | t] - Extrinsische Matrix
Ich habe zwei Ansätze ausprobiert, um eine Transformationsmatrix für die Kamera zu finden: mit solvePnP von OpenCV und manueller Berechnung von Homographie basierend auf 4 koplanaren Punkten.
1. Finde die Homographie
Dieser Schritt ist erfolgreich, da die UV-Koordinaten des Ursprungs der Welt korrekt zu sein scheinen.
2. Intrinsische Matrix
Um die Matrix des iPhone 6 zu erhalten, habe ich diese App verwendet, die gab mir folgendes Ergebnis von 100 Bildern von 640 * 480 Auflösung:
Wenn das Eingangsbild ein Bildseitenverhältnis von 4: 3 hat, kann ich die obige Matrix abhängig von der Auflösung skalieren
Ich bin mir nicht sicher, aber es fühlt sich hier wie ein potenzielles Problem an. Ich habe cv :: calibrationMatrixValues verwendet, um fovx auf die berechnete intrinsische Matrix zu überprüfen, und das Ergebnis war ~ 50 °, während es nahe bei 60 ° liegen sollte.
3. Kamera-Pose-Matrix
%Vor%Ergebnis:
Da ich die ungefähre Position und Orientierung für dieses spezielle Bild gemessen habe, kenne ich die Transformationsmatrix, die das erwartete Ergebnis liefern würde und es ist ganz anders:
Ich bin auch etwas besorgt über 2-3 Element der Referenzrotationsmatrix, die -9.1 ist, während es stattdessen nahe Null sein sollte, da es eine sehr geringe Rotation gibt.
Es gibt eine solvePnP Funktion in OpenCV für diese Art von Problemen, also habe ich versucht, es anstelle von zu verwenden das Rad neu erfinden.
OpenCV in Objective-C ++:
%Vor%Verwendung in Swift:
%Vor%Ausgabe:
Das Ergebnis ist besser, aber weit von meinen Erwartungen entfernt.
Einige andere Dinge, die ich auch versucht habe:
Ich bin wirklich mit diesem Problem beschäftigt, daher würde jede Hilfe sehr geschätzt werden.
Eigentlich war ich mit OpenCV einen Schritt weiter von der Arbeitslösung entfernt.
Mein Problem mit dem zweiten Ansatz war, dass ich vergessen habe, die Ausgabe von solvePnP
zurück in das SpriteKit-Koordinatensystem zu konvertieren.
Beachten Sie, dass die Eingabe (Bild- und Weltpunkte) tatsächlich korrekt in das OpenCV-Koordinatensystem konvertiert wurde ( convertObjectPoints:
und convertImagePoints:withSize:
Methoden)
Also hier ist eine feste Methode findCameraPose
mit einigen Kommentaren und Zwischenergebnisse gedruckt:
Anmerkungen:
Tags und Links opencv ios scenekit augmented-reality homography