Metadatos XMP para Photo Sphere

El espacio de nombres para fotos panorámicas que aquí se describe contiene propiedades que proporcionan información acerca de cómo crear y presentar fotos esféricas, también llamadas panorámicas, como las que creas con la función Photo Sphere en la cámara de Android 4.2. Los metadatos se deben serializar e integrar a la foto esférica como se describe en el estándar de Adobe XMP (consulta referencias al final de esta página).

El URI del espacio de nombres es http://ns.google.com/photos/1.0/panorama/

Propiedades de los metadatos

El diagrama y la tabla que se muestran a continuación contienen las propiedades de las fotos esféricas. Los desarrolladores que escriben estos metadatos deben asegurarse de seguir las Convenciones de ángulos de Euler que se indican más adelante en este documento. Los desarrolladores que editan y visualizan fotos esféricas deben asegurarse de verificar y actualizar los metadatos en consecuencia tal como se describe más adelante en este documento.

Nombre Tipo Obligatorio Valor predeterminado
(visor asumido)
Descripción de propiedades Acción requerida si se modifica la imagen
GPano:UsePanoramaViewer Valor booleano No True Determina si se debe mostrar esta imagen en un visor de fotos esféricas en lugar de mostrarla como una imagen plana normal. Esto se puede especificar en función de las preferencias del usuario o mediante el software de cosido de imágenes. La aplicación que exhibe o incorpora la imagen puede decidir ignorar esto. ajustar a escala/recortar:
sin cambios. Una aplicación puede decidir cambiar esto a “False” si el campo de visión es inferior a un valor determinado.
GPano:CaptureSoftware Cadena No N/D Si la captura se realizó con una aplicación en un dispositivo móvil, como un teléfono Android, el nombre de la aplicación que se usó (como “Photo Sphere”). Se debe dejar en blanco si las imágenes de origen se capturaron manualmente, como ocurre al usar una cámara DSLR en un trípode. N/D
GPano:StitchingSoftware Cadena No N/D El software que se usó para crear la foto esférica final. Algunas veces, puede ser el mismo valor que el de  GPano:CaptureSoftware. N/D
GPano:ProjectionType Elección libre de texto

equirrectangular

Tipo de proyección usado en el archivo de imagen. Los productos de Google actualmente admiten el valor equirrectangular. ajustar a escala/recortar: Sin cambios
GPano:PoseHeadingDegrees Real No, pero es obligatorio para mostrar en Google Maps N/D Orientación según la brújula, medida en grados, para el centro de la imagen. El valor debe ser >= 0 y < 360. ajustar a escala/recortar: Sin cambios
GPano:PosePitchDegrees Real No 0 Inclinación, medida en grados, para el centro de la imagen. El valor debe ser >= -90 y <= 90. ajustar a escala/recortar: Sin cambios
GPano:PoseRollDegrees Real No 0 Balanceo de la imagen, medido en grados, donde el nivel con el horizonte es 0. El valor debe ser > -180 y <= 180. ajustar a escala/recortar: Sin cambios
GPano:InitialViewHeadingDegrees Entero No 0 El ángulo de orientación de la vista inicial en grados. ajustar a escala/recortar: Sin cambios
GPano:InitialViewPitchDegrees Entero No 0 El ángulo de inclinación de la vista inicial en grados. ajustar a escala/recortar: Sin cambios
GPano:InitialViewRollDegrees Entero No 0 El ángulo de balanceo de la vista inicial en grados. ajustar a escala/recortar: Sin cambios
GPano:InitialHorizontalFOVDegrees Real No N/D El campo visual horizontal inicial que el visor debe mostrar (en grados). Es similar al nivel de zoom. N/D
GPano:FirstPhotoDate Fecha No N/D Fecha y hora para la primera imagen creada en Photo Sphere. ajustar a escala/recortar: Sin cambios
GPano:LastPhotoDate Fecha No N/D Fecha y hora para la última imagen creada en Photo Sphere. ajustar a escala/recortar: Sin cambios
GPano:SourcePhotosCount Entero No N/D Cantidad de imágenes de origen usadas para crear la foto esférica. ajustar a escala/recortar: Sin cambios
GPano:ExposureLockUsed Valor booleano No N/D Indica si cuando se tomaron las fotos de origen individuales estaba bloqueada la configuración de exposición de la cámara. N/D
GPano:CroppedAreaImageWidthPixels Entero N/D Ancho original de la imagen en píxeles (equivalente al ancho real de la imagen para imágenes sin editar). ajustar a escala/recortar: Esta propiedad se debe actualizar para reflejar el nuevo tamaño de la imagen.
GPano:CroppedAreaImageHeightPixels Entero N/D Altura original de la imagen en píxeles (equivalente a la altura real de la imagen para imágenes sin editar). ajustar a escala/recortar: Esta propiedad se debe actualizar para reflejar el nuevo tamaño de la imagen.
GPano:FullPanoWidthPixels Entero N/D Ancho completo original a partir del cual se recortó la imagen. Si solo se capturó una foto esférica parcial, esta propiedad especifica el ancho que hubiera tenido la foto esférica completa. recortar: Sin cambios
ajustar a escala: Esta propiedad se debe ajustar a escala de forma adecuada.
GPano:FullPanoHeightPixels Entero N/D Altura completa original a partir de la cual se recortó la imagen. Si solo se capturó una foto esférica parcial, esta propiedad especifica la altura que hubiera tenido la foto esférica completa. recortar: Sin cambios
ajustar a escala: Esta propiedad se debe ajustar a escala de forma adecuada.
GPano:CroppedAreaLeftPixels Entero N/D Columna en la que el borde izquierdo de la imagen se recortó a partir de la foto esférica de tamaño completo. recortar: Si se modifica el recorte izquierdo de la imagen, se debe actualizar este valor.
ajustar a escala: Esta propiedad se debe ajustar a escala de forma adecuada.
GPano:CroppedAreaTopPixels Entero N/D Fila en la que el borde superior de la imagen se recortó a partir de la foto esférica de tamaño completo. recortar: Si se modifica el recorte superior de la imagen, se debe actualizar este valor.
ajustar a escala: Esta propiedad se debe ajustar a escala de forma adecuada.
GPano:InitialCameraDolly Real No 0 Este parámetro opcional mueve la posición de la cámara virtual a lo largo de la línea de visión, lejos del centro de la foto esférica. Una posición superficial trasera se representa con el valor -1.0, mientras que la posición superficial delantera se representa con el valor 1.0. Para la visualización normal, este parámetro debe fijarse en 0. N/D

Ejemplo de una foto esférica completa

Aquellas personas que no sean programadores pueden agregar el ejemplo de metadatos que se proporciona a continuación a sus fotos esféricas completas ya existentes (360 grados x 180 grados) solo con pequeñas modificaciones. Esto se puede realizar en productos de edición de imágenes, como Adobe Photoshop.

  1. cambia las ocurrencias de 4000 y 2000 para que coincidan con el ancho y la altura correspondientes de tu imagen en píxeles
  2. actualiza PoseHeadingDegrees si quieres que Google Maps muestre tu foto esférica; no obstante, también puedes eliminar este parámetro
  3. actualiza o elimina parámetros opcionales (como se indicó anteriormente)
<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>

Ejemplo de una foto esférica parcial

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

Solidez para la edición de imágenes

Para ser sólidos, los programas que muestran fotos esféricas en un visor deben comprobar si una aplicación ajustó la foto esférica original a escala sin actualizar los metadatos. Esto se puede realizar en los siguientes pasos:

  1. asegúrate de que la etiqueta CroppedAreaImageWidthPixels sea equivalente al ancho real de la imagen
  2. asegúrate de que la etiqueta CroppedAreaImageHeightPixels sea equivalente a la altura real de la imagen
  3. si el paso 1 o 2 falla, comprueba si se conservó la relación de aspecto de la imagen
  4. si el paso 3 falla, no muestres la imagen como una foto esférica ya que se transformó de una forma incompatible que generará distorsiones graves
  5. si el paso 3 es exitoso, la relación de aspecto es equivalente y todos los valores asociados de la etiqueta que se indican a continuación se ajustarán a escala para adaptarse al nuevo tamaño de la imagen:
    CroppedAreaImageWidthPixels, CroppedAreaImageHeightPixels, FullPanoWidthPixels, FullPanoHeightPixels, CroppedAreaLeftPixels, CroppedAreaRightPixels.

Información general sobre ángulos de Euler

La orientación de la foto esférica en el marco del mundo está definida por ángulos de Euler. Los ángulos de Euler pueden definirse de diversas maneras. Para hacerlo correctamente, un programa debe seguir estrictamente las convenciones de los ángulos de Euler que se describen aquí.

La posición sobre la superficie de la tierra define un "marco local" fijo XYZ, en el que Z es hacia arriba y en sentido ortogonal con respecto a la superficie de la tierra, X es el extremo este e Y es el extremo norte. La orientación se define con respecto a este "marco local" fijo, y los ángulos de Euler son rotaciones alrededor de esos ejes XYZ fijos.  Por lo tanto, la orientación de la pose es indefinida en los polos. Esto significa que una foto esférica con ángulos (0, 0, 0) se orientará de modo que el píxel central se enfrente al norte con el Ecuador de la foto esférica paralelo a la superficie de la tierra.

Los ángulos de Euler proporcionan una representación desde puntos en el "marco de la foto esférica" (girada) hasta puntos en el "marco local" (fijo):
 
Se puede construir una matriz de rotación a partir de ángulos de Euler de la siguiente manera (es importante preservar este orden):

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

donde: R_*(t) es una rotación hacia la derecha alrededor del eje especificado:

    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 = Up, X = East, Y = North.

Es importante preservar el orden siguiente

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

,

ya que las rotaciones no son conmutativas.

Ten en cuenta que al ángulo de orientación es el mismo que la orientación estándar según la brújula.

Referencias

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