Metadati XMP delle foto sferiche

Lo spazio dei nomi delle foto panoramiche qui descritto contiene proprietà che forniscono informazioni relative alla creazione e al rendering delle foto sferiche, a volte chiamate anche panoramiche, come quelle create dalla funzionalità Foto sferica nella fotocamera Android 4.2. I metadati devono essere serializzati e incorporati nella foto sferica come descritto dallo standard Adobe XMP (vedi i references alla fine di questa pagina).

L'URI dello spazio dei nomi è http://ns.google.com/photos/1.0/panorama/

Proprietà dei metadati

I diagrammi e la tabella di seguito mostrano le proprietà delle foto sferiche incapsulate dai parametri GPano. Quando modifichi e visualizzi le foto sferiche, assicurati di verificare e aggiornare i metadati di conseguenza, come descritto più avanti in questo documento. Quando specifichi i campi per la posa e l'intestazione iniziale, assicurati di seguire le convenzioni sugli angoli di Eulero illustrate più avanti in questo documento.

Tieni presente che i prodotti Google supportano solo le proiezioni sferiche. Al momento le proiezioni aggiuntive sono supportate solo da altri soggetti.

Proiezioni sferiche

Proiezioni cilindriche

Tieni presente che se la parte superiore di un'immagine cilindrica si trova sopra l'orizzonte, i valori dei pixel dell'area ritagliata in alto devono essere negativi. Il valore 0 per RitagliapedAreaTopPixels posiziona la parte superiore dell'immagine all'orizzonte. Un valore positivo di RitagliapedAreaTopPixels posiziona la parte superiore dell'immagine sotto l'orizzonte.

Riferimento per il parametro GPano

Nome Tipo Obbligatorie Valore predefinito
(previsto dallo spettatore)
Descrizione proprietà Azione richiesta se l'immagine viene modificata
GPano:UsePanoramaViewer Booleano No Vero Consente di stabilire se mostrare questa immagine in un visualizzatore di foto sferiche anziché come una normale immagine piatta. Potrebbe essere specificato in base alle preferenze dell'utente o dal software di stitching. L'applicazione che visualizza o importa l'immagine potrebbe scegliere di ignorarlo. scala/taglia:
nessuna modifica. Un'applicazione potrebbe decidere di cambiare questa impostazione su False se il campo visivo è inferiore a un determinato valore.
GPano:CaptureSoftware Stringa No n/d Se l'acquisizione è stata effettuata utilizzando un'applicazione su un dispositivo mobile, ad esempio un telefono Android, il nome dell'applicazione utilizzata (ad esempio "Foto sferica"). Il campo deve essere lasciato vuoto se le immagini di origine sono state acquisite manualmente, ad esempio utilizzando una fotocamera DSLR su un treppiede. n/d
GPano:StitchingSoftware Stringa No n/d Il software utilizzato per creare la foto sferica finale. A volte potrebbe essere lo stesso valore di GPano:CaptureSoftware. n/d
GPano:ProjectionType Apri scelta di testo

equirettangolare

Tipo di proiezione utilizzato nel file immagine. Al momento i prodotti Google supportano solo il valore equirettangolare. scala/taglia: nessuna modifica.
GPano:PoseHeadingDegrees Esiste No, ma è obbligatoria per la visualizzazione su Google Maps n/d Orientamento della bussola, misurata in gradi in senso orario dal nord, per il centro dell'immagine. Il valore deve essere maggiore o uguale a 0 e minore di 360. scala/taglia: nessuna modifica.
GPano:PosePitchDegrees Esiste No 0 Tonalità, misurata in gradi sopra l'orizzonte, per il centro dell'immagine. Il valore deve essere >= -90 e <= 90. scala/taglia: nessuna modifica.
GPano:PoseRollDegrees Esiste No 0 Rotolo, misurato in gradi, dell'immagine in cui il livello con l'orizzonte è 0. All'aumentare del rotazione del cerchio, l'orizzonte ruota in senso antiorario nell'immagine. Il valore deve essere maggiore di -180 e minore o uguale a 180. scala/taglia: nessuna modifica.
GPano:InitialViewHeadingDegrees Numero intero No 0 L'angolo di orientamento della vista iniziale in gradi in senso orario dal nord del mondo reale, non rispetto al centro del panorama. scala/taglia: nessuna modifica.
GPano:InitialViewPitchDegrees Numero intero No 0 L'angolo di inclinazione della vista iniziale in gradi sopra l'orizzonte del mondo reale, non rispetto al centro del panorama. scala/taglia: nessuna modifica.
GPano:InitialViewRollDegrees Numero intero No 0 L'angolo di rotazione della vista iniziale in gradi, dove il livello con l'orizzonte del mondo reale è 0. All'aumentare del rollio, l'orizzonte ruota in senso antiorario nella vista. scala/taglia: nessuna modifica.
GPano:InitialHorizontalFOVDegrees Esiste No n/d Il campo visivo orizzontale iniziale che il visualizzatore dovrebbe mostrare (in gradi). È simile a un livello di zoom. n/d
GPano:InitialVerticalFOVDegrees Esiste No n/d Il campo visivo verticale iniziale che il visualizzatore dovrebbe mostrare (in gradi). È simile a un livello di zoom. Se sono presenti entrambi GPano:InitialHorizontalFOVDegrees e GPano:InitialVerticalFOVDegrees, GPano:InitialHorizontalFOVDegrees ha la precedenza. Utilizza solo InitialVerticalFOVDegrees se i contenuti devono essere visualizzati in più proporzioni e preferisci che il campo visivo verticale rimanga costante, mentre il campo visivo orizzontale potrebbe cambiare. Al momento i prodotti Google non supportano questo campo. n/d
GPano:FirstPhotoDate Data No n/d Data e ora della prima immagine creata nella foto sferica. scala/taglia: nessuna modifica.
GPano:LastPhotoDate Data No n/d Data e ora dell'ultima immagine creata nella foto sferica. scala/taglia: nessuna modifica.
GPano:SourcePhotosCount Numero intero No n/d Numero di immagini di origine utilizzate per creare la foto sferica. scala/taglia: nessuna modifica.
GPano:ExposureLockUsed Booleano No n/d Quando sono state acquisite singole fotografie originali, se l'impostazione di esposizione della fotocamera era bloccata o meno. n/d
GPano:CroppedAreaImageWidthPixels Numero intero n/d La larghezza originale dell'immagine in pixel (uguale alla larghezza effettiva dell'immagine per le immagini non modificate). Consulta i diagrammi in alto. scala/ritaglio: questa proprietà deve essere aggiornata per riflettere la nuova dimensione dell'immagine.
GPano:CroppedAreaImageHeightPixels Numero intero n/d Altezza originale dell'immagine in pixel (uguale all'altezza effettiva dell'immagine per le immagini non modificate). Consulta i diagrammi in alto. scala/ritaglio: questa proprietà deve essere aggiornata per riflettere la nuova dimensione dell'immagine.
GPano:FullPanoWidthPixels Numero intero n/d Larghezza originale da cui è stata ritagliata l'immagine. Se è stata acquisita solo una foto sferica parziale, specifica la larghezza della foto sferica completa. Consulta i diagrammi in alto. ritaglio: nessuna modifica.
scala: questo valore deve essere adeguato di conseguenza.
GPano:FullPanoHeightPixels Numero intero n/d Altezza intera originale da cui l'immagine è stata ritagliata. Se è stata acquisita solo una foto sferica parziale, specifica l'altezza di quella che sarebbe stata l'intera foto sferica. Consulta i diagrammi in alto. ritaglio: nessuna modifica.
scala: questo valore deve essere adeguato di conseguenza.
GPano:CroppedAreaLeftPixels Numero intero n/d Colonna in cui il bordo sinistro dell'immagine è stato ritagliato dalla foto sferica a grandezza originale. Consulta i diagrammi in alto. Ritaglio: se il ritaglio a sinistra dell'immagine viene modificato, questo valore deve essere aggiornato.
scala: questo valore deve essere adeguato di conseguenza.
GPano:CroppedAreaTopPixels Numero intero n/d Riga in cui il bordo superiore dell'immagine è stato ritagliato dalla foto sferica a grandezza originale. Consulta i diagrammi in alto. Ritaglio: se il ritaglio superiore dell'immagine viene modificato, questo valore deve essere aggiornato.
Scala: questo valore deve essere adeguato di conseguenza.
GPano:InitialCameraDolly Esiste No 0 Questo parametro facoltativo sposta la posizione della fotocamera virtuale lungo la linea visiva, lontano dal centro della foto sferica. La posizione della superficie posteriore è rappresentata dal valore -1,0, mentre la posizione della superficie anteriore è rappresentata dal valore 1,0. Per una visualizzazione normale, questo parametro deve essere impostato su 0. n/d

Esempio di foto sferica intera

I non programmatori possono aggiungere l'esempio di metadati riportato di seguito alle foto sferiche complete esistenti (360 x 180 gradi) apportando solo piccole modifiche. Questa operazione può essere eseguita in prodotti per la modifica di immagini, come Adobe Photoshop.

  1. modifica le occorrenze di 4000 e 2000 in modo che corrispondano alla larghezza e all'altezza dell'immagine in pixel corrispondenti
  2. aggiorna PoseHeadingDegrees se vuoi che Google Maps possa mostrare la tua foto sferica; altrimenti puoi rimuovere questo parametro se vuoi
  3. aggiornare o rimuovere parametri facoltativi (come elencato sopra)
<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>

Esempio di foto sferica parziale

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

Robustezza nell'editing delle immagini

Per essere affidabili, i programmi che visualizzano le foto sferiche in un visualizzatore devono verificare se la foto sferica originale è stata ridimensionata da un'applicazione senza aggiornare i metadati. Questa operazione può essere eseguita nei seguenti passaggi:

  1. assicurati che il tag RitagliapedAreaImageLarghezzaPixels sia uguale alla larghezza effettiva dell'immagine
  2. assicurati che il tag RitagliapedAreaImageHeightPixels corrisponda all'altezza effettiva dell'immagine
  3. Se il passaggio 1 o 2 non riesce, controlla se le proporzioni dell'immagine sono state mantenute
  4. Se il passaggio 3 non va a buon fine, non visualizzare l'immagine come foto sferica poiché è stata trasformata in un modo incompatibile che introdurrà cattive distorsioni
  5. Se viene superato il passaggio 3, le proporzioni sono equivalenti e tutti i seguenti valori dei tag associati devono essere ridimensionati per adattarsi alle nuove dimensioni dell'immagine:
    RitagliapedAreaImageLarghezzaPixels, RitagliapedAreaImageHeightPixels, FullPanoLarghezzaPixels, FullPanoHeightPixels, RitagliapedAreaLeftPixels, RitagliapedAreaRightPixels.

Panoramica degli angoli di Eulero

L'orientamento della foto sferica nella cornice del mondo è definito dagli angoli di Eulero. Gli angoli di Eulero possono essere definiti in molti modi. Per essere corretto, un programma deve seguire rigorosamente le convenzioni dell'angolo di Eulero qui descritte.

La posizione al di sopra della superficie terrestre definisce un "frame locale" fisso XYZ, dove Z è in alto e ortogonale alla superficie terrestre, X è vero est e Y è il nord vero. L'orientamento viene definito in base a questo "frame locale" fisso e gli angoli di Eulero sono rotazioni attorno a questi assi XYZ fissi. L'orientamento della posa non è quindi definito ai poli. Ciò significa che una foto sferica con angoli (0, 0, 0) sarà orientata in modo che il pixel centrale sia rivolto verso nord con l'equatore della foto sferica parallelo alla superficie terrestre.

Gli angoli di Eulero forniscono una mappatura dai punti della "cornice di foto sferica" (ruotata) ai punti del "frame locale" (fisso):
 
Viene creata una matrice di rotazione dagli angoli di Eulero come segue (è importante preservare questo ordine):

R = R_Z(-intestazione) * R_X(proposta) * R_Y(rullo)

dove: R_*(t) è una rotazione a destra intorno all'asse denominato:

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

e dove: Z = in alto, X = est, Y = nord.

È importante mantenere questo ordine:

R = R_Z(-intestazione) * R_X(proposta) * R_Y(rullo)

poiché le rotazioni non sono commutative.

Tieni presente che l'angolo di orientamento è uguale a quella di una bussola standard.

Riferimenti

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