Photo Sphere XMP-Metadaten

Der hier beschriebene Panorama-Namensraum enthält Eigenschaften, die Informationen zur Erstellung und Wiedergabe von Panoramaansichten liefern (auch als Panoramen bezeichnet), z. B. erstellt mit der Photo Sphere-Funktion in der Kamera von Android 4.2. Die Metadaten müssen serialisiert und in ein Panorama eingebettet werden, wie durch den Adobe XMP -Standard beschrieben (siehe Referenzen am Ende dieser Seite).

Der Namespace-URI lautet http://ns.google.com/photos/1.0/panorama/

Metadaten-Eigenschaften

Im nachfolgenden Diagramm und der Tabelle sind die Panoramaeigenschaften aufgeführt. Entwickler, die diese Metadaten schreiben, müssen die weiter unten in diesem Dokument genannten Eulerwinkel-Konventionen beachten. Entwickler, die Panoramaansichten bearbeiten und anzeigen, müssen die Metadaten gemäß der Beschreibung weiter unten in diesem Dokument überprüfen und aktualisieren.

übereinstimmen.
Name Typ Erforderlich Standardwert
(Anzeigeprogramm vorausgesetzt)
Beschreibung der Eigenschaft Bei Bearbeitung des Bilds erforderliche Aktion
GPano:UsePanoramaViewer Boolescher Wert Nein True Gibt an, ob dieses Bild in einem Panoramaanzeigeprogramm und nicht als normales flaches Abbild angezeigt werden soll. Dies kann basierend auf den Benutzervoreinstellungen oder durch die Zusammenfügungssoftware festgelegt werden. Von der Anwendung, die das Bild anzeigt oder erfasst, kann diese ggf. ignoriert werden. Skalierung/Zuschnitt:
Keine Änderung. Dieser Wert kann in einer Anwendung auf „False“ gesetzt werden, wenn das Feld oder die Ansicht unter einen bestimmten Wert sinkt.
GPano:CaptureSoftware Zeichenfolge Nein - Wenn die Aufnahme mit einer Anwendung auf einem mobilen Gerät, z. B. einem Android-Smartphone, erfolgte, ist dies der Name der verwendeten Anwendung (z. B. “Photo Sphere”). Hier sollte kein Eintrag stehen, wenn die Ausgangsbilder manuell aufgenommen wurden, z. B. mit einer digitalen Spiegelreflexkamera auf einem Stativ. -
GPano:StitchingSoftware Zeichenfolge Nein - Die Software, die zur Erstellung des fertigen Panoramas verwendet wurde. Dieser Wert kann in einigen Fällen mit dem Wert für  GPano:CaptureSoftware-
GPano:ProjectionType Freie Textauswahl Ja

Equirektangular

Die Art der in der Bilddatei verwendeten Projektion. Google-Produkte unterstützen derzeit den Wert „Equirektangular“. Skalierung/Zuschnitt: Keine Änderung.
GPano:PoseHeadingDegrees Reelle Zahl Nein, aber der Wert ist für die Anzeige in Google Maps erforderlich - Kompassausrichtung, gemessen in Grad, für den Mittelpunkt des Bilds. Der Wert muss >= 0 und < 360 sein. Skalierung/Zuschnitt: Keine Änderung.
GPano:PosePitchDegrees Reelle Zahl Nein 0 Neigungswinkel, gemessen in Grad, für den Mittelpunkt des Bilds. Der Wert muss >= -90 und <= 90 sein. Skalierung/Zuschnitt: Keine Änderung.
GPano:PoseRollDegrees Reelle Zahl Nein 0 Roll-Wert des Bilds, gemessen in Grad, wobei 0 auf einer Ebene mit dem Horizont bedeutet. Der Wert muss > -180 und <= 180 sein. Skalierung/Zuschnitt: Keine Änderung.
GPano:InitialViewHeadingDegrees Ganzzahl Nein 0 Die Orientierung der Anfangssicht in Grad. Skalierung/Zuschnitt: Keine Änderung.
GPano:InitialViewPitchDegrees Ganzzahl Nein 0 Der Neigungswinkel der Anfangssicht in Grad. Skalierung/Zuschnitt: Keine Änderung.
GPano:InitialViewRollDegrees Ganzzahl Nein 0 Der Rollwinkel der Anfangssicht in Grad. Skalierung/Zuschnitt: Keine Änderung.
GPano:InitialHorizontalFOVDegrees Reelle Zahl Nein - Das anfängliche horizontale Sichtfeld, das durch das Anzeigeprogramm dargestellt werden soll (in Grad). Dieser Wert ähnelt einer Vergrößerungsstufe. -
GPano:FirstPhotoDate Datum Nein - Datum und Uhrzeit des ersten im Panorama erstellten Bilds. Skalierung/Zuschnitt: Keine Änderung.
GPano:LastPhotoDate Datum Nein - Datum und Uhrzeit des letzten im Panorama erstellten Bild. Skalierung/Zuschnitt: Keine Änderung.
GPano:SourcePhotosCount Ganzzahl Nein - Anzahl der zum Erstellen des Panoramas verwendeten Ausgangsbilder. Skalierung/Zuschnitt: Keine Änderung.
GPano:ExposureLockUsed Boolescher Wert Nein - Wenn einzelne Ausgangsfotos aufgenommen wurden, gibt der Wert an, ob die Belichtungskorrektur der Kamera gesperrt war. -
GPano:CroppedAreaImageWidthPixels Ganzzahl Ja - Die ursprüngliche Breite des Bilds in Pixel (entspricht der tatsächlichen Bildbreite nicht bearbeiteter Bilder). Skalierung/Zuschnitt: Diese Eigenschaft muss aktualisiert werden, damit sie die neue Größe des Bilds wiedergibt.
GPano:CroppedAreaImageHeightPixels Ganzzahl Ja - Die ursprüngliche Höhe des Bilds in Pixel (entspricht der tatsächlichen Bildhöhe nicht bearbeiteter Bilder). Skalierung/Zuschnitt: Diese Eigenschaft muss aktualisiert werden, damit sie die neue Größe des Bilds wiedergibt.
GPano:FullPanoWidthPixels Ganzzahl Ja - Ursprüngliche Gesamtbreite vor dem Zuschneiden des Bilds. Wenn nur ein Teilpanorama aufgenommen wurde, gibt dieser Wert die Breite an, die das gesamte Panorama gehabt hätte. Zuschnitt: Keine Änderung.
Skalierung: Eine entsprechende korrekte Skalierung ist erforderlich.
GPano:FullPanoHeightPixels Ganzzahl Ja - Ursprüngliche Gesamthöhe vor dem Zuschneiden des Bilds. Wenn nur ein Teilpanorama aufgenommen wurde, gibt dieser Wert die Höhe an, die das gesamte Panorama gehabt hätte. Zuschnitt: Keine Änderung.
Skalierung: Eine entsprechende korrekte Skalierung ist erforderlich.
GPano:CroppedAreaLeftPixels Ganzzahl Ja - Die Spalte, in der der linke Rand des Panoramabilds in voller Größe zugeschnitten wurde. Zuschnitt: Wenn der linke Zuschnitt des Bilds geändert wird, muss dieser Wert aktualisiert werden.
Skalierung: Eine entsprechende korrekte Skalierung ist erforderlich.
GPano:CroppedAreaTopPixels Ganzzahl Ja - Die Zeile, in der der obere Rand des Panoramabilds in voller Größe zugeschnitten wurde. Zuschnitt: Wenn der obere Zuschnitt des Bilds geändert wird, muss dieser Wert aktualisiert werden.
Skalierung: Eine entsprechende korrekte Skalierung ist erforderlich.
GPano:InitialCameraDolly Reelle Zahl Nein 0 Dieser optionale Parameter verschiebt die Position der virtuellen Kamera entlang der Sichtlinie, weg vom Mittelpunkt Ihres Panoramas. Eine hintere Flächenposition wird durch den Wert -1,0 dargestellt, eine vordere Flächenposition durch den Wert 1,0. Für die normale Anzeige ist dieser Parameter auf den Wert 0 zu setzen. -

Beispiel eines vollständigen Panoramas

Wenn Sie kein Programmierer sind, können Sie das nachfolgende Metadatenbeispiel zu Ihrem vorhandenen vollständigen Panorama (360 Grad x 180 Grad) mit nur unwesentlichen Änderungen hinzufügen. Verwenden Sie dazu ein Bildbearbeitungsprogramm, z. B. Adobe Photoshop.

  1. Ändern Sie alle vorkommenden Werte 4000 und 2000 in die entsprechende Breite und Höhe Ihres Bilds in Pixeln.
  2. Aktualisieren Sie „PoseHeadingDegrees“, wenn Sie die Darstellung Ihres Panoramas in Google Maps ermöglichen möchten; anderenfalls können Sie diesen Parameter entfernen.
  3. Aktualisieren oder entfernen Sie optionale Parameter (wie oben aufgeführt).
<rdf:Description rdf:about="" xmlns:GPano="http://ns.google.com/photos/1.0/panorama/">
    <GPano:UsePanoramaViewer>True</GPano:UsePanoramaViewer>
    <GPano:CaptureSoftware>Photo Sphere</GPano:CaptureSoftware>
    <GPano:StitchingSoftware>Photo Sphere</GPano:StitchingSoftware>
    <GPano:ProjectionType>equirectangular</GPano:ProjectionType>
    <GPano:PoseHeadingDegrees>350.0</GPano:PoseHeadingDegrees>
    <GPano:InitialViewHeadingDegrees>90.0</GPano:InitialViewHeadingDegrees>
    <GPano:InitialViewPitchDegrees>0.0</GPano:InitialViewPitchDegrees>
    <GPano:InitialViewRollDegrees>0.0</GPano:InitialViewRollDegrees>
    <GPano:InitialHorizontalFOVDegrees>75.0</GPano:InitialHorizontalFOVDegrees>
    <GPano:CroppedAreaLeftPixels>0</GPano:CroppedAreaLeftPixels>
    <GPano:CroppedAreaTopPixels>0</GPano:CroppedAreaTopPixels>
    <GPano:CroppedAreaImageWidthPixels>4000</GPano:CroppedAreaImageWidthPixels>
    <GPano:CroppedAreaImageHeightPixels>2000</GPano:CroppedAreaImageHeightPixels>
    <GPano:FullPanoWidthPixels>4000</GPano:FullPanoWidthPixels>
    <GPano:FullPanoHeightPixels>2000</GPano:FullPanoHeightPixels>
    <GPano:FirstPhotoDate>2012-11-07T21:03:13.465Z</GPano:FirstPhotoDate>
    <GPano:LastPhotoDate>2012-11-07T21:04:10.897Z</GPano:LastPhotoDate>
    <GPano:SourcePhotosCount>50</GPano:SourcePhotosCount>
    <GPano:ExposureLockUsed>False</GPano:ExposureLockUsed>
</rdf:Description>

Beispiel einer Teilpanoramaansicht

<rdf:Description rdf:about="" xmlns:GPano="http://ns.google.com/photos/1.0/panorama/">
    <GPano:UsePanoramaViewer>True</GPano:UsePanoramaViewer>
    <GPano:CaptureSoftware>Photo Sphere</GPano:CaptureSoftware>
    <GPano:StitchingSoftware>Photo Sphere</GPano:StitchingSoftware>
    <GPano:ProjectionType>equirectangular</GPano:ProjectionType>
    <GPano:PoseHeadingDegrees>350.0</GPano:PoseHeadingDegrees>
    <GPano:InitialViewHeadingDegrees>90.0</GPano:InitialViewHeadingDegrees>
    <GPano:InitialViewPitchDegrees>0.0</GPano:InitialViewPitchDegrees>
    <GPano:InitialViewRollDegrees>0.0</GPano:InitialViewRollDegrees>
    <GPano:InitialHorizontalFOVDegrees>75.0</GPano:InitialHorizontalFOVDegrees>
    <GPano:CroppedAreaLeftPixels>90</GPano:CroppedAreaLeftPixels>
    <GPano:CroppedAreaTopPixels>128</GPano:CroppedAreaTopPixels>
    <GPano:CroppedAreaImageWidthPixels>2300</GPano:CroppedAreaImageWidthPixels>
    <GPano:CroppedAreaImageHeightPixels>1042</GPano:CroppedAreaImageHeightPixels>
    <GPano:FullPanoWidthPixels>4000</GPano:FullPanoWidthPixels>
    <GPano:FullPanoHeightPixels>2000</GPano:FullPanoHeightPixels>
    <GPano:FirstPhotoDate>2012-11-07T21:03:13.465Z</GPano:FirstPhotoDate>
    <GPano:LastPhotoDate>2012-11-07T21:04:10.897Z</GPano:LastPhotoDate>
    <GPano:SourcePhotosCount>50</GPano:SourcePhotosCount>
    <GPano:ExposureLockUsed>False</GPano:ExposureLockUsed>
</rdf:Description>

Robustheit bei der Bildbearbeitung

Um Robustheit sicherzustellen, müssen Programme, die Panoramen mit einem Anzeigeprogramm anzeigen, überprüfen, ob die ursprüngliche Panoramaansicht durch eine Anwendung aktualisiert wurde, ohne die Metadaten zu aktualisieren. Führen Sie dazu folgende Schritte aus:

  1. Stellen Sie sicher, dass der Tag „CroppedAreaImageWidthPixels“ mit der tatsächlichen Bildbreite übereinstimmt.
  2. Stellen Sie sicher, dass der Tag „CroppedAreaImageHeightPixels“ mit der tatsächlichen Bildhöhe übereinstimmt.
  3. Wenn Schritt 1 oder 2 nicht erfolgreich ist, überprüfen Sie, ob das Seitenverhältnis des Bild beibehalten wurde
  4. Wenn Schritt 3 nicht erfolgreich ist, zeigen Sie das Bild nicht als Panorama an, da es auf inkompatible Weise umgewandelt wurde und ein Aufrufen zu starken Verzerrungen führen würde.
  5. Ist Schritt 3 erfolgreich, wurde das Seitenverhältnis beibehalten, und alle folgenden zugehörigen Tag-Werte sollten so skaliert werden, dass sie zur neuen Bildgröße passen:
    CroppedAreaImageWidthPixels, CroppedAreaImageHeightPixels, FullPanoWidthPixels, FullPanoHeightPixels, CroppedAreaLeftPixels, CroppedAreaRightPixels.

Übersicht über die Eulerwinkel

Die Ausrichtung des Panoramas im Weltrahmen wird durch Eulerwinkel definiert. Es gibt viele Möglichkeiten, um Eulerwinkel zu definieren. Für eine korrekte Ausrichtung muss ein Programm die hier beschriebenen Eulerwinkel-Konventionen genau befolgen.

Die Position oberhalb der Erdoberfläche definiert einen festen "lokalen Rahmen" XYZ. Hierbei bedeutet Z oben und rechtwinklig zur Erdoberfläche, X ist der geografische Osten, und Y ist der geografische Norden. Die Ausrichtung ist relativ zu diesem festen "lokalen Rahmen" definiert, und die Eulerwinkel bezeichnen Drehungen um diese festen XYZ-Achsen.  Die Positionsausrichtung ist daher an den Polen nicht definiert. Das bedeutet, dass ein Panorama mit den Winkeln (0, 0, 0) so ausgerichtet ist, dass der zentrale Pixel zum geografischen Norden weist und der Äquator des Panoramas parallel zur Erdoberfläche verläuft.

Die Eulerwinkel sorgen für eine Zuordnung von Punkten im (rotierten) "Panoramarahmen " zu Punkten im (festen) "lokalen Rahmen":
 
Eine Rotationsmatrix wird wie folgt aus den Eulerwinkeln konstruiert (diese Reihenfolge ist unbedingt einzuhalten):

R = R_Z(-heading) * R_X(pitch) * R_Y(roll)

Hierbei gilt: R_*(t) eine Rotation nach rechts um die genannte Achse ist:

    R_Z(angle) = [ cos(angle), -sin(angle),  0
                   sin(angle),  cos(angle),  0
                   0,       0,  1 ]
 
    R_X(angle) = [ 1,       0,      0,
                   0,  cos(angle), -sin(angle),
                   0,  sin(angle),  cos(angle) ]
 
    R_Y(angle) = [ cos(angle),  0,  sin(angle),
                   0,  1,       0,
                   -sin(angle),  0,  cos(angle) ]

and where: Z =Wobei gilt: Z = oben, X = Osten, Y = Norden.

Diese Reihenfolge ist unbedingt einzuhalten:

R = R_Z(-heading) * R_X(pitch) * R_Y(roll)

da Rotationen nicht kommutativ sind.

Beachten Sie, dass die Orientierung mit der Standardkompassausrichtung übereinstimmt.

Referenzen

Adobe XMP standard: http://www.adobe.com/devnet/xmp.html