Метаданные XMP фотосферы

Описанное здесь пространство имен панорамы содержит свойства, которые предоставляют информацию о создании и рендеринге панорам, также иногда называемых панорамами, например созданных с помощью функции «Фотосфера» в камере Android 4.2. Метаданные должны быть сериализованы и встроены в панораму, как описано в стандарте Adobe XMP (см. ссылки в конце этой страницы).

URI пространства имен: http://ns.google.com/photos/1.0/panorama/

Свойства метаданных

На диаграммах и в таблице ниже показаны свойства фотосферы, инкапсулированные параметрами GPano. При редактировании и просмотре панорам обязательно проверяйте и обновляйте метаданные соответствующим образом, как описано далее в этом документе. При указании полей положения и начального курса обязательно следуйте соглашениям об углах Эйлера, обсуждаемым далее в этом документе.

Обратите внимание, что продукты Google поддерживают только сферические проекции. Дополнительные прогнозы в настоящее время поддерживаются только другими партиями.

Сферические проекции

Цилиндрические проекции

Обратите внимание: если верхняя часть цилиндрического изображения находится над горизонтом, значение CroppedAreaTopPixels должно быть отрицательным. Значение 0 для CroppedAreaTopPixels поместит верхнюю часть изображения на горизонт. Положительное значение CroppedAreaTopPixels помещает верхнюю часть изображения ниже горизонта.

Справочник параметров GPano

Имя Тип Необходимый Значение по умолчанию
(предполагал зритель)
Описание недвижимости Требуется действие, если изображение изменено
GPano:UsePanoramaViewer логическое значение Нет Истинный Показывать ли это изображение в средстве просмотра панорам, а не как обычное плоское изображение. Это может быть указано на основе предпочтений пользователя или с помощью программного обеспечения для сшивания. Приложение, отображающее или принимающее изображение, может игнорировать это. масштаб/обрезка:
Никаких изменений. Приложение может решить переключить это значение на False, если поле зрения падает ниже определенного значения.
GPano:CaptureSoftware Нить Нет н/д Если съемка производилась с помощью приложения на мобильном устройстве, например на телефоне Android, название использованного приложения (например, «Фотосфера»). Это поле следует оставить пустым, если исходные изображения были сняты вручную, например, с помощью зеркальной камеры на штативе. н/д
GPano:Программное обеспечение для вышивания Нить Нет н/д Программное обеспечение, которое использовалось для создания финальной панорамы. Иногда это может быть то же значение, что и у GPano:CaptureSoftware. н/д
GPano:Проекционтипе Открытый выбор текста Да

равноугольный

Тип проекции, используемый в файле изображения. Продукты Google в настоящее время поддерживают только равноугольное значение. масштаб/обрезка: без изменений.
GPano:PoseHeadingDegrees Настоящий Нет, но требуется для отображения на Картах Google. н/д Курс по компасу, измеренный в градусах по часовой стрелке от севера, для центра изображения. Значение должно быть >= 0 и < 360. масштаб/обрезка: без изменений.
GPano:PosePitchDegrees Настоящий Нет 0 Угол наклона (измеряется в градусах над горизонтом) для центра изображения. Значение должно быть >= -90 и <= 90. масштаб/обрезка: без изменений.
GPano:PoseRollDegrees Настоящий Нет 0 Поворот изображения, измеряемый в градусах, где уровень горизонта равен 0. По мере увеличения поворота горизонт на изображении вращается против часовой стрелки. Значение должно быть > -180 и <= 180. масштаб/обрезка: без изменений.
GPano:InitialViewHeadingDegrees Целое число Нет 0 Угол курса исходного вида в градусах по часовой стрелке от реального севера, а не относительно центра панорамы. масштаб/обрезка: без изменений.
GPano:InitialViewPitchDegrees Целое число Нет 0 Угол наклона исходного вида в градусах над горизонтом реального мира, а не относительно центра панорамы. масштаб/обрезка: без изменений.
GPano:InitialViewRollDegrees Целое число Нет 0 Угол поворота исходного вида в градусах, где уровень реального горизонта равен 0. По мере увеличения поворота горизонт в виде вращается против часовой стрелки. масштаб/обрезка: без изменений.
GPano:InitialHorizontalFOVDegrees Настоящий Нет н/д Начальное горизонтальное поле зрения, которое зритель должен отобразить (в градусах). Это похоже на уровень масштабирования. н/д
GPano:InitialVerticalFOVDegrees Настоящий Нет н/д Начальное вертикальное поле зрения, которое зритель должен отобразить (в градусах). Это похоже на уровень масштабирования. Если присутствуют оба GPano:InitialHorizontalFOVDegrees и GPano:InitialVerticalFOVDegrees, GPano:InitialHorizontalFOVDegrees имеет приоритет. Используйте только InitialVerticalFOVDegrees, если ваш контент должен отображаться в нескольких соотношениях сторон и вы предпочитаете, чтобы вертикальное поле обзора оставалось постоянным, а горизонтальное поле обзора могло меняться. Продукты Google в настоящее время не поддерживают это поле. н/д
GPano:FirstPhotoDate Дата Нет н/д Дата и время первого изображения, созданного в панораме. масштаб/обрезка: без изменений.
GPano:LastPhotoDate Дата Нет н/д Дата и время последнего изображения, созданного в панораме. масштаб/обрезка: без изменений.
GPano:SourcePhotosCount Целое число Нет н/д Количество исходных изображений, использованных для создания панорамы. масштаб/обрезка: без изменений.
GPano:ExposureLockUsed логическое значение Нет н/д При съемке фотографий с отдельных источников независимо от того, была ли заблокирована настройка экспозиции камеры. н/д
GPano:CroppedAreaImageWidthPixels Целое число Да н/д Исходная ширина изображения в пикселях (равна фактической ширине изображения для неотредактированных изображений). См. схемы выше. масштаб/обрезка: это свойство необходимо обновить, чтобы оно отражало новый размер изображения.
GPano:CroppedAreaImageHeightPixels Целое число Да н/д Исходная высота изображения в пикселях (равна фактической высоте изображения для неотредактированных изображений). См. схемы выше. масштаб/обрезка: это свойство необходимо обновить, чтобы оно отражало новый размер изображения.
GPano:FullPanoWidthPixels Целое число Да н/д Исходная полная ширина, из которой было обрезано изображение. Если была снята только неполная фотосфера, это определяет ширину полной фотосферы. См. схемы выше. урожай: Без изменений.
масштаб: его необходимо соответствующим образом масштабировать.
GPano:FullPanoHeightPixels Целое число Да н/д Исходная полная высота, из которой было обрезано изображение. Если была снята только неполная фотосфера, это определяет высоту полной фотосферы. См. схемы выше. урожай: Без изменений.
масштаб: его необходимо соответствующим образом масштабировать.
GPano:CroppedAreaLeftPixels Целое число Да н/д Столбец, в котором левый край изображения обрезан из полноразмерной панорамы. См. схемы выше. обрезка: если левая обрезка изображения изменена, это значение необходимо обновить.
масштаб: его необходимо соответствующим образом масштабировать.
GPano:CroppedAreaTopPixels Целое число Да н/д Строка, в которой верхний край изображения был обрезан из полноразмерной панорамы. См. схемы выше. обрезка: если верхняя обрезка изображения изменена, это значение необходимо обновить.
масштаб: его необходимо соответствующим образом масштабировать.
GPano:InitialCameraDolly Настоящий Нет 0 Этот необязательный параметр перемещает положение виртуальной камеры вдоль линии обзора от центра фотосферы. Положение задней поверхности представлено значением -1,0, а положение передней поверхности — 1,0. Для нормального просмотра этот параметр должен быть установлен на 0. н/д

Пример полной фотосферы

Непрограммисты могут добавить приведенный ниже пример метаданных к своим существующим полным панорамам (360 x 180 градусов) с небольшими изменениями. Это можно сделать в продуктах для редактирования изображений, таких как Adobe Photoshop.

  1. измените все вхождения 4000 и 2000, чтобы они соответствовали соответствующей ширине и высоте вашего изображения в пикселях.
  2. обновите PoseHeadingDegrees, если хотите, чтобы Карты Google могли отображать вашу панораму; в противном случае вы можете удалить этот параметр по желанию.
  3. обновить или удалить необязательные параметры (как указано выше)
<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>

Пример частичной фотосферы

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

Устойчивость к редактированию изображений

Чтобы быть надежными, программы, отображающие панорамы в средстве просмотра, должны проверять, была ли исходная панорама масштабирована приложением без обновления метаданных. Это можно сделать следующими шагами:

  1. убедитесь, что тег CroppedAreaImageWidthPixels равен фактической ширине изображения.
  2. убедитесь, что тег CroppedAreaImageHeightPixels равен фактической высоте изображения.
  3. если шаг 1 или 2 не удался, проверьте, сохранилось ли соотношение сторон изображения
  4. если шаг 3 не удался, не отображайте изображение в виде фотосферы, поскольку оно было преобразовано несовместимым образом, что приведет к сильным искажениям.
  5. Если шаг 3 пройден успешно, соотношение сторон будет эквивалентным, и все следующие значения связанных тегов должны быть масштабированы в соответствии с новым размером изображения:
    CroppedAreaImageWidthPixels, CroppedAreaImageHeightPixels, FullPanoWidthPixels, FullPanoHeightPixels, CroppedAreaLeftPixels, CroppedAreaRightPixels.

Обзор углов Эйлера

Ориентация фотосферы в мировой системе координат определяется углами Эйлера. Углы Эйлера можно определить разными способами. Чтобы быть корректной, программа должна строго следовать соглашениям об углах Эйлера, описанным здесь.

Положение над земной поверхностью определяет фиксированную «локальную систему координат» XYZ, где Z — вверх и ортогонально земной поверхности, X — истинный восток, а Y — истинный север. Ориентация определяется относительно этой фиксированной «локальной системы отсчета», а углы Эйлера представляют собой повороты вокруг этих фиксированных осей XYZ. Таким образом, ориентация позы на полюсах не определена. Это означает, что фотосфера с углами (0, 0, 0) будет ориентирована так, что центральный пиксель будет направлен строго на север, а экватор фотосферы будет параллелен поверхности Земли.

Углы Эйлера обеспечивают сопоставление точек в (повернутой) «рамке фотосферы» с точками в (фиксированной) «локальной системе координат»:

Матрица вращения строится из углов Эйлера следующим образом (важно сохранить этот порядок):

R = R_Z(-курс) * R_X(шаг) * R_Y(крен)

где: R_*(t) — правостороннее вращение вокруг названной оси:

R_Z(угол) = [ cos(угол), -sin(угол), 0
грех(угол), cos(угол), 0
0, 0, 1]

R_X(угол) = [ 1, 0, 0,
0, cos(угол), -sin(угол),
0, sin(угол), cos(угол)]

R_Y(угол) = [ cos(угол), 0, sin(угол),
0, 1, 0,
-sin(угол), 0, cos(угол) ]

и где: Z = вверх, X = восток, Y = север.

Важно сохранить этот порядок:

R = R_Z(-курс) * R_X(шаг) * R_Y(крен)

поскольку вращения не коммутативны.

Обратите внимание, что угол курса такой же, как и стандартный курс по компасу.

Ссылки

Стандарт Adobe XMP: http://www.adobe.com/devnet/xmp.html.