Metadane zdjęć sferycznych XMP

Opisana tu przestrzeń nazw panoram zawiera właściwości, które dostarczają informacji o tworzeniu i renderowaniu zdjęć sferycznych, zwanych też panoramami, np. utworzonymi za pomocą funkcji Photo Sphere w aparacie w Androidzie 4.2. Metadane powinny zostać zserializowane i umieszczone w zdjęciu sferycznym zgodnie ze standardem Adobe XMP (patrz references na końcu tej strony).

Identyfikator URI przestrzeni nazw to http://ns.google.com/photos/1.0/panorama/

Właściwości metadanych

Na diagramach i w tabeli poniżej widać właściwości zdjęcia sferycznego zawarte w parametrach GPano. Gdy edytujesz i wyświetlasz zdjęcia sferyczne, pamiętaj, by zweryfikować i zaktualizować metadane zgodnie z opisem w dalszej części tego dokumentu. Podczas określania pozycji i początkowego nagłówka stosuj konwencje kątów Eulera omówione w dalszej części tego dokumentu.

Pamiętaj, że usługi Google obsługują tylko odwzorowania sferyczne. Dodatkowe przewidywania są obecnie obsługiwane tylko przez inne firmy.

Odwzorowania sferyczne

Odwzorowania walcowe

Pamiętaj, że jeśli górna część obrazu walcowego znajduje się powyżej horyzontu, wartość CroppedAreaTopPixels musi być ujemna. Wartość 0 w przypadku CroppedAreaTopPixels spowoduje umieszczenie górnej części obrazu na horyzoncie. Dodatnia wartość parametru CroppedAreaTopPixels umieszcza górną część obrazu poniżej horyzontu.

Odniesienie parametru GPano

Nazwa Typ Wymagane Wartość domyślna
(zakładana przez przeglądającego)
Opis obiektu Wymagane działanie w przypadku zmodyfikowania obrazu
GPano:UsePanoramaViewer Wartość logiczna Nie Prawda Określa, czy obraz ma być wyświetlany w przeglądarce zdjęć sferycznych czy jako zwykły płaski obraz. Wartość ta może być określona w zależności od preferencji użytkownika lub przez oprogramowanie do łączenia zdjęć. Aplikacja wyświetlająca lub przetwarzająca obraz może to zignorować. skala/przycięcie:
Bez zmian. Aplikacja może zmienić to ustawienie na Fałsz, jeśli pole widzenia spadnie poniżej określonej wartości.
GPano:CaptureSoftware Ciąg znaków Nie Nie dotyczy Jeśli zdjęcia zostały zrobione w aplikacji na urządzeniu mobilnym, takim jak telefon z Androidem, podaj jej nazwę (np. „Photo Sphere”). To pole powinno pozostać puste, jeśli zdjęcia źródłowe zostały wykonane ręcznie (np. przy użyciu lustrzanki cyfrowej statywu). Nie dotyczy
GPano:StitchingSoftware Ciąg znaków Nie Nie dotyczy Oprogramowanie użyte do utworzenia ostatecznego zdjęcia sferycznego. Może to być ta sama wartość, co w przypadku GPano:Capture Software. Nie dotyczy
GPano:ProjectionType Otwórz wybór tekstu Tak

równoprostokątny

Typ projekcji używany w pliku obrazu. Usługi Google obsługują obecnie tylko wartość walcową równoodległościową. skala/przycięcie: bez zmian.
GPano:PoseHeadingDegrees Prawdziwe Nie, ale jest wymagana do wyświetlania w Mapach Google Nie dotyczy Kierunek kompasu mierzony w stopniach w prawo od północy, na potrzeby wyśrodkowania zdjęcia. Wartość musi mieścić się w zakresie od 0 do 360. skala/przycięcie: bez zmian.
GPano:PosePitchDegrees Prawdziwe Nie 0 Odchylenie mierzone w stopniach powyżej horyzontu, na środku zdjęcia. Wartość musi mieścić się w zakresie >= -90 i <= 90. skala/przycięcie: bez zmian.
GPano:PoseRollDegrees Prawdziwe Nie 0 Obrót (mierzona w stopniach) obrazu, na którym poziom horyzontu wynosi 0. Wraz ze wzrostem obrócenia horyzont obraca się w lewo. Wartość musi mieścić się w zakresie od -180 do <= 180. skala/przycięcie: bez zmian.
GPano:InitialViewHeadingDegrees Liczba całkowita Nie 0 Kąt nachylenia początkowego widoku wyrażony w stopniach w prawo od rzeczywistej północy, a nie względem środka panoramy. skala/przycięcie: bez zmian.
GPano:InitialViewPitchDegrees Liczba całkowita Nie 0 Kąt nachylenia widoku początkowego w stopniach nad rzeczywistym horyzontem, a nie względem środka panoramy. skala/przycięcie: bez zmian.
GPano:InitialViewRollDegrees Liczba całkowita Nie 0 Kąt obrót widoku początkowego w stopniach, przy którym poziom względem rzeczywistego horyzontu wynosi 0. Wraz ze wzrostem obrócenia horyzont obraca się w kierunku przeciwnym do ruchu wskazówek zegara. skala/przycięcie: bez zmian.
GPano:InitialHorizontalFOVDegrees Prawdziwe Nie Nie dotyczy Początkowe poziome pole widoku (w stopniach), które użytkownik powinien wyświetlać. Przypomina to powiększenie. Nie dotyczy
GPano:InitialVerticalFOVDegrees Prawdziwe Nie Nie dotyczy Początkowe pionowe pole widoku, które użytkownik powinien wyświetlać (w stopniach). Przypomina to powiększenie. Jeśli dostępne są zarówno wartości GPano:InitialHorizontalFOVStops, jak i GPano:InitialPionowąFOVstopnia, pierwszeństwo ma wartość GPano:InitialHorizontalFOVStops. Używaj tylko wartości Początkowe pole widzenia w pionie, jeśli treść ma być wyświetlana w różnych formatach obrazu i wolisz, aby pionowe pole widzenia pozostawało bez zmian, a pole widzenia w poziomie może się zmieniać. Usługi Google nie obsługują obecnie tego pola. Nie dotyczy
GPano:FirstPhotoDate Data Nie Nie dotyczy Data i godzina utworzenia pierwszego zdjęcia sferycznego. skala/przycięcie: bez zmian.
GPano:LastPhotoDate Data Nie Nie dotyczy Data i godzina utworzenia ostatniego zdjęcia sferycznego. skala/przycięcie: bez zmian.
GPano:SourcePhotosCount Liczba całkowita Nie Nie dotyczy Liczba obrazów źródłowych użytych do utworzenia zdjęcia sferycznego. skala/przycięcie: bez zmian.
GPano:ExposureLockUsed Wartość logiczna Nie Nie dotyczy Określa, czy ustawienie ekspozycji aparatu było zablokowane podczas robienia poszczególnych zdjęć źródłowych. Nie dotyczy
GPano:CroppedAreaImageWidthPixels Liczba całkowita Tak Nie dotyczy Oryginalna szerokość obrazu w pikselach (równa rzeczywista szerokość obrazu w przypadku nieedytowanych obrazów). Zapoznaj się z diagramami powyżej. skala/przycięcie: należy zaktualizować tę właściwość, aby odzwierciedlić nowy rozmiar obrazu.
GPano:CroppedAreaImageHeightPixels Liczba całkowita Tak Nie dotyczy Oryginalna wysokość w pikselach obrazu (jest równa rzeczywistej wysokości obrazu w przypadku nieedytowanych obrazów). Zapoznaj się z diagramami powyżej. skala/przycięcie: należy zaktualizować tę właściwość, aby odzwierciedlić nowy rozmiar obrazu.
GPano:FullPanoWidthPixels Liczba całkowita Tak Nie dotyczy Oryginał o pełnej szerokości, z której obraz został przycięty. Jeśli zostało wykonane tylko częściowe zdjęcie sferyczne, ta wartość określa szerokość całego zdjęcia sferycznego. Zapoznaj się z diagramami powyżej. przycięcie: bez zmian.
skala: należy odpowiednio przeskalować.
GPano:FullPanoHeightPixels Liczba całkowita Tak Nie dotyczy Oryginalna pełna wysokość, z której obraz został przycięty. Jeśli zostało wykonane tylko częściowe zdjęcie sferyczne, ta wartość określa wysokość całego zdjęcia sferycznego. Zapoznaj się z diagramami powyżej. przycięcie: bez zmian.
skala: należy odpowiednio przeskalować.
GPano:CroppedAreaLeftPixels Liczba całkowita Tak Nie dotyczy Kolumna, w której lewa krawędź obrazu została przycięta z pełnowymiarowego zdjęcia sferycznego. Zapoznaj się z diagramami powyżej. przycięcie: jeśli zmieni się lewe przycięcie obrazu, należy zaktualizować tę wartość.
Skala: należy odpowiednio przeskalować.
GPano:CroppedAreaTopPixels Liczba całkowita Tak Nie dotyczy Wiersz, w którym górna krawędź obrazu została przycięta z pełnowymiarowego zdjęcia sferycznego. Zapoznaj się z diagramami powyżej. przycięcie: jeśli zmieni się górne przycięcie obrazu, należy zaktualizować tę wartość.
Skalowanie: dane należy odpowiednio przeskalować.
GPano:InitialCameraDolly Prawdziwe Nie 0 Ten opcjonalny parametr przesuwa pozycję kamery wirtualnej wzdłuż linii wzroku od środka zdjęcia sferycznego. Położenie tylnej powierzchni jest określone wartością -1,0, a położenie przedniej – 1,0. W przypadku normalnego wyświetlania ten parametr powinien mieć wartość 0. Nie dotyczy

Przykład pełnego zdjęcia sferycznego

Osoby, które nie są programistami, mogą dodać poniższy przykład metadanych do swoich pełnych zdjęć sferycznych (360 x 180 stopni), wprowadzając jedynie niewielkie modyfikacje. Możesz to zrobić w usługach do edycji obrazów, takich jak Adobe Photoshop.

  1. zmień wszystkie wystąpienia wartości 4000 i 2000, aby pasowały do odpowiedniej szerokości i wysokości obrazu w pikselach
  2. zaktualizuj PoseHeadingDegrs, jeśli chcesz, by Mapy Google mogły wyświetlać Twoje zdjęcie sferyczne. W przeciwnym razie możesz opcjonalnie usunąć ten parametr.
  3. zaktualizuj lub usuń parametry opcjonalne (jak opisano powyżej)
<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>

Przykład częściowego zdjęcia sferycznego

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

Dostępność w zakresie edycji obrazów

Programy wyświetlające zdjęcia sferyczne na przeglądarce powinny sprawdzać, czy oryginalne zdjęcie sferyczne zostało przeskalowane przez aplikację bez aktualizowania metadanych. Aby to zrobić:

  1. upewnij się, że tag CroppedAreaImagewidthPixels jest równy rzeczywistej szerokości obrazu
  2. upewnij się, że tag CroppedAreaImageHeightPixels jest równy rzeczywistej wysokości obrazu
  3. Jeśli krok 1 lub 2 się nie powiedzie, sprawdź, czy format obrazu został zachowany
  4. Jeśli krok 3 się nie powiedzie, nie wyświetlaj obrazu jako zdjęcia sferycznego, ponieważ zostało ono przekształcone w niezgodny sposób, co spowoduje poważne zniekształcenia
  5. Po przejściu etapu 3 współczynnik proporcji jest równoważny i wszystkie te powiązane wartości tagów powinny zostać przeskalowane tak, aby pasowały do nowego rozmiaru obrazu:

Omówienie kątów Eulera

Orientacja zdjęcia sferycznego w ramce światowej jest określana przez kąty Eulera. Kąty Eulera można zdefiniować na wiele sposobów. Aby było to poprawne, program musi ściśle przestrzegać opisanych tu konwencji kąta Eulera.

Położenie nad powierzchnią Ziemi określa stałą „lokalną ramkę” XYZ, gdzie Z jest względem powierzchni Ziemi, X to rzeczywisty wschód, a Y jest ustawiony na północ. Orientacja jest określana względem tej stałej „ramki lokalnej”, a kąty Eulera to obroty wokół tych stałych osi XYZ. Umiejscowienie na biegunach jest więc nieokreślone. Oznacza to, że zdjęcie sferyczne o kątach (0, 0, 0) będzie zorientowane tak, że piksel centralny będzie zwrócony na północ nad równikiem zdjęcia sferycznego równolegle do powierzchni Ziemi.

Kąty Eulera zapewniają mapowanie punktów w (obróconej) „ramce zdjęcia sferycznego” do punktów w (stałej) „ramce lokalnej”:
 
Macierz obrotu jest tworzona z kątów Eulera w następujący sposób (ważne jest zachowanie takiej kolejności):

R = R_Z(-nagłówek) * R_X(wystaw) * R_Y(rolka)

gdzie: R_*(t) to obrót w prawo wokół nazwanej osi:











gdzie: Z = góra, X = wschód, Y = północ.

Ważne jest zachowanie tej kolejności:

R = R_Z(-nagłówek) * R_X(wystaw) * R_Y(rolka)

bo obroty nie są przemienne.

Kąt kierowania jest taki sam jak w przypadku standardowego kompasu.

Odniesienia

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