Metadados XMP de Photo Spheres

O namespace do panorama descrito aqui contém propriedades que fornecem informações sobre a criação e a renderização de esferas fotográficas, também chamados de panoramas, aqueles criados pelo recurso Photo Sphere da câmera do Android 4.2. A metadados devem ser serializados e incorporados na esfera fotográfica como descritos pelo Adobe XMP padrão (consulte as referências no final desta página).

O URI do namespace é http://ns.google.com/photos/1.0/panorama/

Propriedades de metadados

Os diagramas e a tabela abaixo mostram as propriedades de esferas fotográficas encapsuladas por os parâmetros GPano. Ao editar e visualizar as panorâmicas 360°, não se esqueça de verificar e atualizar os metadados adequadamente, conforme descrito posteriormente neste documento. Ao especificar os campos de pose e cabeçalho iniciais, certifique-se de seguir as convenções do ângulo de Euler discutidas mais adiante este documento.

Os produtos do Google são compatíveis apenas com projeções esféricas. No momento, as projeções adicionais são aceitas apenas por terceiros.

Projeções esféricas

Projeções cilíndricas

Se o topo de uma imagem cilíndrica estiver acima do horizonte, CroppedAreaTopPixels precisa ser negativo. Um valor de 0 para CroppedAreaTopPixels vai colocar a parte superior da imagem no horizonte. Um valor positivo de CroppedAreaTopPixels posiciona a parte superior da imagem abaixo do horizonte.

Referência de parâmetro GPano

Nome Tipo Obrigatório Valor padrão
(Espectador assumido)
Descrição da propriedade Ação necessária se a imagem for modificada
GPano:UsePanoramaViewer Booleano Não Verdadeiro Indica se esta imagem será exibida em um visualizador de photo sphere em vez de como uma imagem plana normal. Pode ser especificado com base nas preferências do usuário ou pelo software de montagem. O aplicativo que exibe ou ingere a imagem pode optar por ignorar isso. dimensionamento/corte:
Nenhuma alteração. Um aplicativo pode decidir mudar para False se o campo de visão estiver abaixo de um determinado valor.
GPano:CaptureSoftware String Não N/A Se a captura foi feita com um aplicativo em um dispositivo móvel, como um smartphone Android, informe o nome do aplicativo usado (como "Photo Sphere"). Este campo deve ser deixado em branco se as imagens de origem forem capturadas manualmente, como com o uso de uma DSLR em um tripé. N/A
GPano:StitchingSoftware String Não N/A O software usado para criar a foto esférica final. Às vezes, ele pode ter o mesmo valor de GPano:CaptureSoftware. N/A
GPano:ProjectionType Abrir opção de texto Sim

equirretangular

Tipo de projeção usado no arquivo de imagem. No momento, os produtos do Google só são compatíveis com o valor equirretangular. dimensionamento/corte: nenhuma alteração.
GPano:PoseHeadingDegrees Real Não, mas é necessário para exibição no Google Maps N/A Orientação da bússola, medida em graus no sentido horário a partir do Norte, para o centro da imagem. O valor precisa ser maior ou igual a 0 e menor 360 dimensionamento/corte: nenhuma alteração.
GPano:PosePitchDegrees Real Não 0 Inclinação, medida em graus acima do horizonte, para o centro da imagem. O valor precisa ser maior ou igual a -90 e menor ou igual a 90. dimensionamento/corte: nenhuma alteração.
GPano:PoseRollDegrees Real Não 0 Rolagem, medida em graus, da imagem em que o nivelamento com o horizonte é 0. Conforme a rolagem aumenta, o horizonte gira no sentido anti-horário na imagem. O valor precisa ser maior que -180 e <= 180. dimensionamento/corte: nenhuma alteração.
GPano:InitialViewHeadingDegrees Número inteiro Não 0 O ângulo de direção da visualização inicial em graus no sentido horário a partir do norte do mundo real, não relativo ao centro do panorama. dimensionamento/corte: nenhuma alteração.
GPano:InitialViewPitchDegrees Número inteiro Não 0 O ângulo de inclinação da visualização inicial em graus acima do horizonte do mundo real, não relativo ao centro do panorama. dimensionamento/corte: nenhuma alteração.
GPano:InitialViewRollDegrees Número inteiro Não 0 O ângulo de rolagem da visualização inicial em graus, em que o nível com o horizonte do mundo real é 0. Conforme a rolagem aumenta, o horizonte gira no sentido anti-horário na visualização. dimensionamento/corte: nenhuma alteração.
GPano:InitialHorizontalFOVDegrees Real Não N/A O campo de visão horizontal inicial que o visualizador deve exibir (em graus). Isso é semelhante a um nível de zoom. N/A
GPano:InitialVerticalFOVDegrees Real Não N/A O campo de visão vertical inicial que o visualizador deve exibir (em graus). Isso é semelhante a um nível de zoom. Se GPano:InitialHorizontalFOVdegrees e GPano:InitialVerticalFOVdegrees estiverem presentes, GPano:InitialHorizontalFOVdegrees terá precedência. Use apenas InitialVerticalFOVdegrees se o conteúdo for exibido em várias proporções e você preferir que o campo de visão vertical permaneça constante enquanto o campo de visão horizontal for alterado. No momento, os produtos do Google não oferecem suporte a esse campo. N/A
GPano:FirstPhotoDate Data Não N/A Data e hora da primeira imagem criada na esfera fotográfica. dimensionamento/corte: nenhuma alteração.
GPano:LastPhotoDate Data Não N/A Data e hora da última imagem criada na esfera fotográfica. dimensionamento/corte: nenhuma alteração.
GPano:SourcePhotosCount Número inteiro Não N/A Número de imagens de origem usadas para criar a Photo Sphere. dimensionamento/corte: nenhuma alteração.
GPano:ExposureLockUsed Booleano Não N/A quando as fotografias de origem individuais foram capturadas, independentemente de a configuração de exposição da câmera estar definida ou não. N/A
GPano:CroppedAreaImageWidthPixels Número inteiro Sim N/A Largura original em pixels da imagem (igual à largura da imagem real em imagens não editadas). Veja os diagramas acima. dimensionar/cortar: essa propriedade precisa ser atualizada para refletir o novo tamanho da imagem.
GPano:CroppedAreaImageHeightPixels Número inteiro Sim N/A A altura original em pixels da imagem (igual à altura da imagem real para imagens não editadas). Veja os diagramas acima. dimensionar/cortar: essa propriedade precisa ser atualizada para refletir o novo tamanho da imagem.
GPano:FullPanoWidthPixels Número inteiro Sim N/A Largura total original a partir da qual a imagem foi cortada. Se apenas uma esfera fotográfica parcial tiver sido capturada, esse campo especifica a largura total que a esfera fotográfica completa teria. Veja os diagramas acima. cortar: sem alterações.
redimensionar: precisa ser dimensionado adequadamente.
GPano:FullPanoHeightPixels Número inteiro Sim N/A Altura original total a partir da qual a imagem foi cortada. Se apenas uma esfera fotográfica parcial tiver sido capturada, esse campo especifica a altura total que a esfera fotográfica completa teria. Veja os diagramas acima. cortar: sem alterações.
redimensionar: precisa ser dimensionado adequadamente.
GPano:CroppedAreaLeftPixels Número inteiro Sim N/A Coluna onde a borda esquerda da imagem foi cortada a partir da foto esférica de tamanho original. Veja os diagramas acima. crop: se o corte esquerdo da imagem for alterado, esse valor precisará ser atualizado.
redimensionar: precisa ser dimensionado corretamente.
GPano:CroppedAreaTopPixels Número inteiro Sim N/A Linha em que a borda superior da imagem foi cortada a partir da foto esférica de tamanho original. Veja os diagramas acima. crop: se o corte superior da imagem for alterado, esse valor precisará ser atualizado.
redimensionar: precisa ser dimensionado corretamente.
GPano:InitialCameraDolly Real Não 0 Esse parâmetro opcional move a posição da câmera virtual ao longo da linha de visão para longe do centro da esfera fotográfica. Uma posição de superfície traseira é representada pelo valor -1,0, enquanto uma posição de superfície frontal é representada por 1,0. Para visualização normal, esse parâmetro deve ser definido como 0. N/A

Exemplo de uma Photo Sphere completa

Usuários que não são programadores podem adicionar o exemplo de metadados abaixo à foto completa esferas (360 graus x 180 graus) com apenas pequenas modificações. Isso pode ser feito em produtos de edição de imagem, como o Adobe Photoshop.

  1. altere todas as ocorrências de 4000 e 2000 para que correspondam à largura e altura correspondentes da sua imagem em pixels
  2. atualize PoseHeadingdegrees se quiser que o Google Maps mostre sua Photo Sphere. caso contrário, é possível remover esse parâmetro
  3. atualizar ou remover parâmetros opcionais (conforme listado acima);
<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>

Exemplo de uma 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>

Robustez para edição de imagens

Para serem robustos, os programas que exibem esferas fotográficas em um visualizador devem verificar se a esfera fotográfica original foi dimensionada por um aplicativo sem atualizar o metadados. Isso pode ser feito com as etapas a seguir:

  1. garantir que a tag CroppedAreaImageWidthPixels seja igual à largura real da imagem
  2. verificar se a tag CroppedAreaImageHeightPixels é igual à altura real da imagem
  3. Se a etapa 1 ou 2 falhar, verifique se a proporção da imagem foi preservada
  4. Se a etapa 3 falhar, não exiba a imagem como uma Photo Sphere, pois ela foi transformada de forma incompatível e causaria distorções ruins
  5. Se a etapa 3 for aprovada, a proporção será equivalente e todos os valores de tag associados a seguir precisarão ser dimensionados para se ajustar ao novo tamanho da imagem:
    CroppedAreaImageWidthPixels, CroppedAreaImageHeightPixels, FullPanoWidthPixels, FullPanoHeightPixels, CroppedAreaLeftPixels, CroppedAreaRightPixels.

Visão geral dos ângulos de Euler

A orientação da esfera fotográfica no enquadramento global é definida por Euler ângulos diferentes. Ângulos de Euler podem ser definidos de muitas maneiras. Para estar correto, um programa deve seguir as convenções dos ângulos de Euler descritas aqui.

A posição acima da superfície terrestre define uma "região frame" XYZ, onde Z está para cima e é ortogonal à superfície da Terra, X é leste verdadeiro e Y é norte verdadeiro. A orientação é definida em relação "frame local" fixo, e os ângulos de Euler são rotações em torno desses foram corrigidos os eixos XYZ. Portanto, a orientação das posições é indefinida nos polos. Isso significa que uma esfera fotográfica com ângulos (0, 0, 0) estará orientada de tal forma que pixel central voltado para o norte com o equador da foto esférica paralelo a na superfície terrestre.

Os ângulos de Euler fornecem um mapeamento de pontos na "foto" (girada) frame esférica" em pontos no "frame local" (fixo):
 
Uma matriz de rotação é construída com base nos ângulos de Euler da seguinte forma segue (é importante preservar essa ordem):

R = R_Z(cabeçalho) * R_X(pitch) * R_Y(rolar)

onde: R_*(t) é uma rotação à direita em torno do eixo nomeado:

R_Z(ângulo) = [ cos(ang/ ângulo)/ = = [ cos(ang/ ângulo) -sin(ang(ang): 0









e onde: Z = para cima, X = leste, Y = norte.

É importante preservar esta ordem:

R = R_Z(cabeçalho) * R_X(pitch) * R_Y(rolar)

pois as rotações não são comutativas.

O ângulo de direção é igual ao de uma bússola padrão.

Referências

Padrão Adobe XMP: http://www.adobe.com/devnet/xmp.html