Métadonnées XMP de photo-sphère

L'espace de noms Panorama décrit ici contient des propriétés qui fournissent concernant la création et le rendu des photo-sphères, parfois appelés panoramas, celles créées par la fonctionnalité Photo Sphere de la caméra Android 4.2. La les métadonnées doivent être sérialisées et intégrées à la photo-sphère décrits par le Adobe XMP standard (voir les références au bas de cette page).

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

Propriétés des métadonnées

Les diagrammes et le tableau ci-dessous montrent les propriétés des photo-sphères encapsulées par les paramètres GPano. Lorsque vous modifiez et affichez des photo-sphères, veillez à respecter les consignes suivantes : vérifier et mettre à jour les métadonnées en conséquence, comme décrit plus loin dans ce document. Lorsque vous spécifiez les champs "pose" et "en-tête initial", veillez à suivre les conventions de l'angle d'Euler que nous aborderons plus tard ce document.

Notez que les produits Google ne sont compatibles qu'avec les projections sphériques. Les projections supplémentaires ne sont actuellement prises en charge que par d'autres parties.

Projections sphériques

Projections cylindriques

Notez que si le haut d'une image cylindrique se trouve au-dessus de l'horizon, La valeur de RecadrerZoneTopPixels doit être négative. Une valeur de 0 pour RepresentpedAreaTopPixels place le haut de l'image à l'horizon. Une valeur positive de La fonction RecadrageTopPixels place le haut de l'image sous l'horizon.

Référence du paramètre GPano

Nom Type Obligatoire Valeur par défaut :
(présumé par l'utilisateur)
Description de l'établissement Action requise si l'image est modifiée
GPano:UsePanoramaViewer Booléen Non Vrai Permet d'afficher ou non cette image dans une visionneuse de photo-sphères plutôt que sous la forme d'une image plate normale. 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 ingère l'image peut choisir d'ignorer cela. échelle/recadrage:
Aucun changement. Une application peut définir cette règle sur "False" si le champ de vision passe en dessous d'une certaine valeur.
GPano:CaptureSoftware Chaîne Non n/a Si la capture a été effectuée à l'aide d'une application sur un appareil mobile, comme un téléphone Android, indiquez le nom de l'application utilisée ("Photo Sphere", par exemple). Ce champ doit être vide si les images sources ont été prises manuellement, par exemple à l'aide d'un reflex numérique sur un trépied. n/a
GPano:StitchingSoftware Chaîne Non n/a Logiciel utilisé pour créer la photo-sphère finale. Il peut parfois s'agir de la même valeur que celle de GPano:CaptureSoftware. n/a
GPano:ProjectionType Ouvrir la sélection de texte Oui

équirectangulaire

Type de projection utilisé dans le fichier image. Les produits Google ne sont actuellement compatibles qu'avec la valeur équirectangulaire. mise à l'échelle/recadrage: aucun changement.
GPano:PoseHeadingDegrees Situation réelle Non, mais obligatoire pour s'afficher sur Google Maps n/a Orientation de la boussole, mesurée en degrés dans le sens des aiguilles d'une montre à partir du nord, pour le centre de l'image. Les valeurs doivent être comprises entre >= 0 et < 360. mise à l'échelle/recadrage: aucun changement.
GPano:PosePitchDegrees Situation réelle Non 0 Inclinaison, mesurée en degrés au-dessus de l'horizon, du centre de l'image. Cette valeur doit être comprise entre >= -90 et <= 90. mise à l'échelle/recadrage: aucun changement.
GPano:PoseRollDegrees Situation réelle Non 0 Roulis (en degrés) de l'image où le niveau par rapport à l'horizon est de 0. À mesure que le rouleau augmente, l'horizon pivote dans le sens inverse des aiguilles d'une montre sur l'image. La valeur doit être > -180 et <= 180. mise à l'échelle/recadrage: aucun changement.
GPano:InitialViewHeadingDegrees Entier Non 0 Angle de cap de la vue initiale en degrés dans le sens des aiguilles d'une montre à partir du nord réel, et non par rapport au centre du panorama. mise à l'échelle/recadrage: aucun changement.
GPano:InitialViewPitchDegrees Entier Non 0 Angle d'inclinaison de la vue initiale en degrés au-dessus de l'horizon réel, et non par rapport au centre du panorama. mise à l'échelle/recadrage: aucun changement.
GPano:InitialViewRollDegrees Entier Non 0 Angle de roulis de la vue initiale en degrés où le niveau avec l'horizon réel est de 0. À mesure que le roulis augmente, l'horizon pivote dans le sens inverse des aiguilles d'une montre dans la vue. mise à l'échelle/recadrage: aucun changement.
GPano:InitialHorizontalFOVDegrees Situation réelle Non n/a Champ de vision horizontal initial que la visionneuse doit afficher (en degrés). Cette option est semblable au niveau de zoom. n/a
GPano:InitialVerticalFOVDegrees Situation réelle Non n/a Champ de vision vertical initial que l'utilisateur doit afficher (en degrés). Cette option est semblable au niveau de zoom. Si GPano:InitialHorizontalFOVDegrees et GPano:InitialVerticalFOVDegrees sont tous les deux présents, GPano:InitialHorizontalFOVDegrees est prioritaire.) Utilisez uniquement InitialVerticalFOVDegrees si votre contenu doit être affiché dans plusieurs formats et si vous préférez que le champ de vision vertical reste constant alors que le champ de vision horizontal peut changer. Les produits Google ne prennent pas en charge ce champ pour le moment. n/a
GPano:FirstPhotoDate Date Non n/a Date et heure de la première image créée dans la photo-sphère. mise à l'échelle/recadrage: aucun changement.
GPano:LastPhotoDate Date Non n/a Date et heure de la dernière image créée dans la photo-sphère. mise à l'échelle/recadrage: aucun changement.
GPano:SourcePhotosCount Entier Non n/a Nombre d'images sources utilisées pour créer la photo-sphère. mise à l'échelle/recadrage: aucun changement.
GPano:ExposureLockUsed Booléen Non n/a le moment où les différentes photos ont été prises, si le paramètre d'exposition de l'appareil photo était verrouillé ou non ; n/a
GPano:CroppedAreaImageWidthPixels Entier Oui n/a Largeur d'origine en pixels de l'image (égale à la largeur réelle de l'image pour les images non modifiées). (voir les schémas ci-dessus). scale/crop: cette propriété doit être mise à jour pour refléter la nouvelle taille de l'image.
GPano:CroppedAreaImageHeightPixels Entier Oui n/a Hauteur d'origine en pixels de l'image (égale à la hauteur réelle de l'image pour les images non modifiées). (voir les schémas ci-dessus). scale/crop: cette propriété doit être mise à jour pour refléter la nouvelle taille de l'image.
GPano:FullPanoWidthPixels Entier Oui n/a Largeur maximale d'origine à partir de laquelle l'image a été recadrée. Si seule une photo-sphère partielle a été capturée, ce paramètre spécifie la largeur de la photo-sphère complète. (voir les schémas ci-dessus). crop: aucune modification.
scale: cet attribut doit être correctement mis à l'échelle.
GPano:FullPanoHeightPixels Entier Oui n/a Hauteur totale d'origine à partir de laquelle l'image a été recadrée. Si seule une photo-sphère partielle a été capturée, ce paramètre spécifie la hauteur de la photo-sphère complète. (voir les schémas ci-dessus). crop: aucune modification.
scale: cet attribut doit être correctement mis à l'échelle.
GPano:CroppedAreaLeftPixels Entier Oui n/a Colonne dans laquelle le bord gauche de l'image a été recadré à partir de la photo-sphère de taille réelle. (voir les schémas ci-dessus). crop: si le recadrage à gauche de l'image est modifié, cette valeur doit être mise à jour.
scale: l'image doit être mise à l'échelle en conséquence.
GPano:CroppedAreaTopPixels Entier Oui n/a Ligne dont le bord supérieur de l'image a été recadré à partir de la photo-sphère de taille réelle. (voir les schémas ci-dessus). "crop" : si le recadrage supérieur de l'image est modifié, cette valeur doit être modifiée.
scale: cet élément doit être correctement mis à l'échelle.
GPano:InitialCameraDolly Situation réelle Non 0 Ce paramètre facultatif déplace la position de la caméra virtuelle le long de la ligne de visée, en l'éloignant du centre de la photo-sphère. Une position à l'arrière est représentée par la valeur -1,0, tandis qu'une position sur la surface avant est représentée par la valeur 1,0. Pour un affichage normal, ce paramètre doit être défini sur 0. n/a

Exemple d'une photo-sphère complète

Les non-programmeurs peuvent ajouter l'exemple de métadonnées ci-dessous à leur photo complète existante (360 degrés x 180 degrés) avec seulement de légères modifications. Pour cela, ils doivent utiliser des applications de retouche d'image, telles qu'Adobe Photoshop.

  1. Modifiez les occurrences de 4 000 et 2 000 pour qu'elles correspondent à la largeur et à la hauteur correspondantes de votre image en pixels
  2. Mettez à jour PoseHeadingDegrees si vous souhaitez que Google Maps puisse afficher votre photo-sphère. Sinon, vous avez la possibilité de supprimer ce paramètre
  3. Mettre à jour ou supprimer les paramètres facultatifs (voir 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>

La robustesse des retouches d'image

Pour être robustes, 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 mettre à jour de métadonnées. Voici la procédure à suivre :

  1. Assurez-vous que la balise RecyclerViewpedAreaImageWidthPixels correspond à la largeur réelle de l'image
  2. Assurez-vous que la balise OptiondAreaImageHeightPixels correspond à la hauteur réelle de l'image.
  3. Si l'étape 1 ou 2 échoue, vérifiez si le format de l'image a été préservé
  4. Si l'étape 3 échoue, n'affichez pas l'image sous forme de photo-sphère, car elle a été transformée de manière incompatible avec des distorsions incorrectes.
  5. Si l'étape 3 réussit, le format est équivalent, et toutes les valeurs de tag associées suivantes doivent être mises à l'échelle pour s'adapter à la nouvelle taille de l'image:
    RecadrerImageWidthPixels, RecadrerImageImageHeightPixels, FullPanoWidthPixels, FullPanoHeightPixels, RecadrerZoneGauchePixels, RecadrerDroitePixels.

Présentation des angles d'Euler

L'orientation de la photo-sphère dans le cadre mondial est définie par Euler. différents angles. Les angles d'Euler peuvent être définis de nombreuses manières. Pour être correct, un programme doit strictement suivez les conventions de l'angle d'Euler décrites ici.

La position au-dessus de la surface de la Terre définit une valeur cadre" XYZ, où Z est en haut et perpendiculaire à la surface de la Terre, X est l'est géographique et Y le nord géographique. L'orientation est définie par rapport "cadre local" fixe, et les angles d'Euler sont des rotations autour de ces d'axes XYZ fixes. L'orientation des postures n'est donc pas définie au niveau des pôles. Ce signifie qu'une photo-sphère avec des angles (0, 0, 0) sera orientée de sorte que au centre de chaque face située en direction du nord et l'équateur de la photo-sphère est parallèle à à la surface de la Terre.

Les angles d'Euler permettent de cartographier les points de la "photo" (tournée) cadre sphérique » vers des points du "cadre local" (fixe) :
 
Une matrice de rotation est construite à partir des angles d'Euler sous la forme (il est important de conserver cet ordre):

R = R_Z(en-tête) * R_X(pitch) * R_Y(roll)

où R_*(t) est une rotation vers la droite autour de l'axe nommé :











et où: Z = haut, X = est, Y = nord.

Il est important de conserver cet ordre:

R = R_Z(en-tête) * R_X(pitch) * R_Y(roll)

car les rotations ne sont pas commutatives.

Notez que l'angle de cap est le même que celui d'une boussole standard.

Références

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