Ich habe ein neues Telefon…
…mit einer neuen, interessanten Funktion, die mehrere meiner Steckenpferde verbindet. Digitale Bildformate und Stereoskopie / 3D.
Für die Mixed-Reality-Brille hat Apple das HEIC-Bildformat etwas erweitert. In einem Container werden nicht ein, sondern zwei leicht versetzt erstellte Bilder zusammen mit einigen Metadaten gespeichert. Diese Kombination sorgt beispielsweise in der Bildergalerie dafür, dass ein zusätzliches Icon erscheint, mit dem sich die räumliche Ansicht aktivieren lässt. Auch die aktuellen iPhones können solche Bilder erstellen.
Bevor es um die langweiligen technischen Details geht, hier ein Beispiel mit einem historischen Stereogramm von der VintageReality Seite. Oben rechts ist der Button für die räumliche Ansicht zu erkennen.
Realisierung
Das Ergebnis wurde durch die folgenden Schritte erzielt:
HEIC-Bilder
Zunächst werden die Bilder aus den Scans der Karten extrahiert. Dazu wird das Modell aus dem letzten Beitrag verwendet. Anschließend werden sie mittels OpenCV fast pixelgenau übereinandergelegt, die entstandenen Ränder werden wo möglich entfernt und die Helligkeit wird angeglichen.
Anschließend werden die beiden Halbbilder in einen HEIC-Container eingebettet, wofür das Python-Modul pillow_heif verwendet wird.
XMP-Metadaten
Die notwendigen Metadaten werden in XMP kodiert, vergleichbar mit alten (2024) UltraHDR-Implementierungen.
Die Elemente ligen im Namensraum http://ns.apple.com/image/1.0/ (Bevorzugtes Präfix apple)
| Element | Typ | Beschreibung |
|---|---|---|
HorizontalFOV |
Real | Horizontales Sichtfeld in Grad. |
Baseline |
Real | Stereo-Basisabstand (Augenabstand) in Millimetern. |
HorizontalDisparityAdjustment |
Real | Faktor zur Anpassung der horizontalen Disparität (in der Regel ein Prozentsatz, z. B. 0,02). |
CameraModelType |
String | Der Projektionsmodelltyp. Verwendeter Wert: SimplifiedPinhole. |
CameraIntrinsics |
String | Intrinsische Kameraparameter als durch Leerzeichen getrennte Zeichenfolge: f_pix 0 ppx 0 f_pix ppy 0 0 1. |
CameraExtrinsicsRotation |
String | Rotationsmatrix als durch Leerzeichen getrennte Zeichenfolge (zeilenorientiert). Wert: 1 0 0 0 1 0 0 0 1 (Identität). |
CameraExtrinsicsPosition |
String | Positionsvektor in Metern als durch Leerzeichen getrennte Zeichenfolge x y z. Wert: 0 0 0. |
StereoGroupIndex |
Integer | Index zur Identifizierung der Stereogruppe. Wert: 1. |
Viele dieser Werte sind (hier) geraten bzw. geschätzt, da sich exakte Werte für die alten verwendeten Kameras nicht ermitteln lassen:
| Parameter | Wert |
|---|---|
| Horizontales Sichtfeld | 45° |
| Augenabstand | 65mm |
| Disparität | 2% |
Die Disparität könnte sich theoretisch auch mit OpenCV über das Alignment ermitteln lassen, aber kleine Abweichungen fallen nicht ins Gewicht. Die restlichen Werte lassen sich aus den Schätzwerten und der Größe der Eingabebilder berechnen:
Weitere Informationen bei Apple Developer
Metadaten injizieren
Am Schluss müssen noch die Metadaten in die Bilddatei injiziert werden. Das lässt sich nach etwas Konfiguration (für den Namespace und die Elemente) mit exiftool von Phil Harvey erledigen.
Ergebnisse
Prinzipiell funktioniert das Verfahren, wobei die Ergebnisse für Innenräume deutlich besser sind als für Außenaufnahmen. Für Außenaufnahmen kann es jedoch hilfreich sein, die räumliche Staffelung der Bildebenen etwas zu stauchen.
Zum Ausprobieren können diese Dateien auf dem iPhone in der App “Fotos” gesichert werden.