Métadonnées XMP pour photo-sphères

L'espace de noms de panorama décrit ici contient des propriétés qui fournissent des informations sur la création et le rendu des photo-sphères, également parfois appelées panoramas, telles que celles créées par la fonction Photo Sphere sur les appareils photo Android 4.2. Les métadonnées doivent être suivies par un numéro de série et intégrées à la photo-sphère tel que décrit par la norme Adobe XMP (voir les références en bas de cette page).

L'URI de l'espace de noms est http://ns.google.com/photos/1.0/panorama/

Propriétés des métadonnées

Le schéma et le tableau ci-dessous présentent les propriétés des photo-sphères. Si vous êtes un développeur qui rédige ces métadonnées, veillez à respecter les conventions sur les angles d'Euler décrites plus loin dans ce document. Si vous êtes un développeur qui modifie et affiche les photo-sphères, veillez à vérifier et à mettre à jour les métadonnées comme décrit plus loin dans ce document.

Nom Type Obligatoire Valeur par défaut
(supposée par la visionneuse)
Description de la propriété Action requise si l'image est modifiée
GPano:UsePanoramaViewer Valeur booléenne Non True Afficher ou non cette image dans une visionneuse photo-sphère plutôt que sous la forme d'une image plate standard. Cette propriété peut être spécifiée en fonction des préférences de l'utilisateur ou par le logiciel d'assemblage des photos. L'application qui affiche ou intègre l'image peut choisir d'ignorer cette propriété. Mise à l'échelle/recadrage :
Aucune modification. Une application peut décider d'affecter la valeur False si le champ de vision est inférieur à une certaine valeur.
GPano:CaptureSoftware Chaîne Non s/o Si la capture a été effectuée à l'aide d'une application sur un appareil mobile, tel qu'un téléphone Android, il s'agit du nom de l'application qui a été utilisée (par ex. « Photo Sphere »). Cette propriété doit être vide si les images d'origine ont été capturées manuellement, par exemple à l'aide d'un appareil DSLR sur un trépied. s/o
GPano:StitchingSoftware Chaîne Non s/o Logiciel qui a été utilisé pour créer la photo-sphère finale. Il peut parfois s'agir de la même valeur que  GPano:CaptureSoftware. s/o
GPano:ProjectionType Texte libre Oui

equirectangular

Type de projection utilisé dans le fichier image. Les produits Google prennent actuellement en charge la valeur equirectangular. Mise à l'échelle/recadrage : Aucune modification.
GPano:PoseHeadingDegrees Valeur réelle Non, mais obligatoire pour affichage sur Google Maps s/o Cap compas, mesuré en degrés, du centre de l'image. La valeur doit être >= 0 et < 360. mise à l'échelle/recadrage : Aucune modification.
GPano:PosePitchDegrees Valeur réelle Non 0 Inclinaison, mesurée en degrés, du centre de l'image. La valeur doit être >= -90 et <= 90. Mise à l'échelle/recadrage : Aucune modification.
GPano:PoseRollDegrees Valeur réelle Non 0 Inclinaison latérale, mesurée en degrés, de l'image lorsque le niveau avec l'horizon est 0. La valeur doit être > -180 et <= 180. Mise à l'échelle/recadrage : Aucune modification.
GPano:InitialViewHeadingDegrees Entier Non 0 Angle de cap de la vue initiale, en degrés. mise à l'échelle/recadrage : Aucune modification.
GPano:InitialViewPitchDegrees Entier Non 0 Angle d'inclinaison de la vue initiale, en degrés. Mise à l'échelle/recadrage : Aucune modification.
GPano:InitialViewRollDegrees Entier Non 0 Angle d'inclinaison latérale de la vue initiale, en degrés. mise à l'échelle/recadrage : Aucune modification.
GPano:InitialHorizontalFOVDegrees Valeur réelle Non s/o Champ de vision horizontal initial que la visionneuse doit afficher (en degrés). Similaire au niveau de zoom. s/o
GPano:FirstPhotoDate Date Non s/o Date et heure de la première image créée dans la photo-sphère. mise à l'échelle/recadrage : Aucune modification.
GPano:LastPhotoDate Date Non s/o Date et heure de la dernière image créée dans la photo-sphère. mise à l'échelle/recadrage : Aucune modification.
GPano:SourcePhotosCount Entier Non s/o Nombre d'images source utilisées pour créer la photo-sphère. mise à l'échelle/recadrage : Aucune modification.
GPano:ExposureLockUsed Valeur booléenne Non s/o Indique si, lors de la prise des photos d'origine, le paramètre d'exposition de l'appareil photo était verrouillé ou non. s/o
GPano:CroppedAreaImageWidthPixels Entier Oui s/o Largeur d'origine en pixels de l'image (correspond à la largeur de l'image réelle pour les images non modifiées). mise à l'échelle/recadrage : Cette propriété doit être mise à jour pour refléter les nouvelles dimensions de l'image.
GPano:CroppedAreaImageHeightPixels Entier Oui s/o Hauteur d'origine, en pixels, de l'image (correspond à la hauteur de l'image réelle pour les images non modifiées). mise à l'échelle/recadrage : Cette propriété doit être mise à jour pour refléter les nouvelles dimensions de l'image.
GPano:FullPanoWidthPixels Entier Oui s/o Largeur totale d'origine à partir de laquelle l'image a été recadrée. Si seule une photo-sphère partielle a été capturée, cette propriété spécifie la largeur supposée de la photo-sphère complète. Recadrage : Aucune modification.
Mise à l'échelle : Cette propriété doit être mise à l'échelle en conséquence.
GPano:FullPanoHeightPixels Entier Oui s/o Hauteur totale d'origine à partir de laquelle l'image a été recadrée. Si seule une photo-sphère partielle a été capturée, cette propriété spécifie la hauteur supposée de la photo-sphère complète. recadrage : Aucune modification.
Mise à l'échelle : Cette propriété doit être mise à l'échelle en conséquence.
GPano:CroppedAreaLeftPixels Entier Oui s/o Colonne où le bord gauche de l'image a été recadré à partir de la photo-sphère d'origine. recadrage : Si le recadrage à gauche de l'image est modifié, cette valeur doit être modifiée.
Mise à l'échelle : Cette propriété doit être mise à l'échelle en conséquence.
GPano:CroppedAreaTopPixels Entier Oui s/o Ligne où le bord supérieur de l'image a été recadré à partir de la photo-sphère d'origine. recadrage : Si le recadrage supérieur de l'image est modifié, cette valeur doit être modifiée.
Mise à l'échelle : Cette propriété doit être mise à l'échelle en conséquence.
GPano:InitialCameraDolly Valeur réelle Non 0 Ce paramètre facultatif déplace la position de l'appareil photo virtuel le long de la ligne de vision, en l'éloignant du centre de la photo-sphère. Une position à projection indirecte est représentée par la valeur -1.0, tandis qu'une position à projection directe est représentée par la valeur 1.0. Pour un affichage normal, ce paramètre doit avoir la valeur 0. s/o

Exemple de photo-sphère complète

Les non-programmeurs peuvent ajouter l'exemple de métadonnées suivant à leurs photo-sphères complètes existantes (360 degrés x 180 degrés) en effectuant quelques petites modifications. Pour cela, ils doivent utiliser des applications de retouche d'image, telles qu'Adobe Photoshop.

  1. Modifiez toutes les occurrences des valeurs 4000 et 2000 de sorte qu'elles correspondent à la hauteur et à la largeur de votre image en pixels
  2. Modifiez le paramètre PoseHeadingDegrees pour permettre à Google Maps d'afficher vos photo-sphères ; sinon, vous pouvez supprimer ce paramètre
  3. Mettez à jour ou supprimez les paramètres facultatifs (répertoriés ci-dessus)
<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>

Exemple de photo-sphère partielle

<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>

Performance de la retouche d'image

Pour être performants, les programmes qui affichent des photo-sphères dans une visionneuse doivent vérifier si la photo-sphère d'origine a été mise à l'échelle par une application sans modification des métadonnées. Voici la procédure à suivre :

  1. Vérifiez que la balise CroppedAreaImageWidthPixels correspond à la largeur d'image réelle
  2. Vérifiez que la balise CroppedAreaImageHeightPixels correspond à la hauteur d'image réelle
  3. Si la condition 1 ou 2 n'est pas vérifiée, vérifiez si le rapport hauteur-largeur de l'image a été conservé
  4. Si la condition 3 n'est pas vérifiée, n'affichez pas l'image comme une photo-sphère car elle a été convertie selon une méthode inappropriée qui a créé de sévères distorsions
  5. Si la condition 3 est vérifiée, le rapport hauteur-largeur a été préservé et toutes les valeurs de balise associées suivantes doivent être mises à l'échelle pour correspondre aux nouvelles dimensions de l'image :
    CroppedAreaImageWidthPixels, CroppedAreaImageHeightPixels, FullPanoWidthPixels, FullPanoHeightPixels, CroppedAreaLeftPixels, CroppedAreaRightPixels.

Présentation des angles d'Euler

L'orientation de la photo-sphère dans l'univers est définie par les angles d'Euler. Les angles d'Euler peuvent être définis de nombreuses manières. Pour fonctionner, un programme doit respecter strictement les conventions d'angle d'Euler décrites ici.

La position au-dessus de la surface de la Terre définit un "cadre local" XYZ fixe, où Z se trouve sur un plan supérieur et orthogonal par rapport à la surface de la terre, X représente l'Est vrai et Y représente le Nord vrai. L'orientation est définie par rapport à ce "cadre local" fixe et les angles d'Euler représentent les rotations autour de ces axes XYZ fixes.  L'orientation de la pose est par conséquent non définie aux pôles. Autrement dit, une photo-sphère avec angles (0, 0, 0) est positionnée de sorte que le pixel central est orienté plein nord avec l'équateur de la photo-sphère parallèle à la surface de la Terre.

Les angles d'Euler fournissent une cartographie des points du "cadre de la photo-sphère" (tourné) par rapport aux points du "cadre local" (fixe) :
 
Une matrice de rotation est créée à partir des angles d'Euler comme suit (il est important de respecter cet ordre) :

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

où : R_*(t) correspond à une rotation vers la droite autour de l'axe désigné :

    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 = Haut, X = Est, Y = Nord.

Il est important de respecter cet ordre :

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

car les rotations ne sont pas commutatives.

Notez que l'angle de cap correspond à un cap compas standard.

Références

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