Метаданные XMP Photo Sphere

Пространство имен панорамы, описанное здесь, содержит свойства, предоставляющие информацию о создании и прорисовке сферических изображений, также называемых панорамами, которые создаются, например, с помощью функции Photo Sphere в камере Android 4.2. Метаданные должны быть сериализированы и встроены в сферическую панораму как описано в стандарте Adobe XMP (см. справочные материалы в конце данной страницы).

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

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

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

Имя Тип Обязательно Значение по умолчанию
(определяется средством просмотра)
Описание свойства Действие, необходимое при изменении изображении
GPano:UsePanoramaViewer Логическое значение Нет True Определяет, нужно ли показывать это изображение в средстве просмотра сферических панорам вместо вывода обычного плоского изображения. Может быть указано на основе предпочтений пользователя или с помощью программного обеспечения для сшивания панорам. Приложение, с помощью которого выполняется отображение или захват изображения, может проигнорировать данное условие. масштабирование/обрезка:
Без изменений. Приложение может установить в данном пункте значение False, если поле обзора уменьшается ниже определенного значения.
GPano:CaptureSoftware Строка Нет Н/Д Если захват был выполнен с помощью приложения на мобильном устройстве, например телефоне Android, имя использованного приложения (например, “Photo Sphere”). Поле должно быть пустым, если исходные изображения были захвачены вручную, например с помощью цифрового зеркального фотоаппарата (DSLR) на штативе. Н/Д
GPano:StitchingSoftware Строка Нет Н/Д Программное обеспечение, использованное для создания итоговой сферической панорамы. Указанные здесь значения могут совпадать со значениями  GPano:CaptureSoftware. Н/Д
GPano:ProjectionType Любой текст Да

equirectangular

Тип проекции, используемый в файле изображения. Продукты Google в настоящий момент поддерживают использование равнопромежуточной проекции. масштабирование/обрезка: Без изменений.
GPano:PoseHeadingDegrees Вещественное число Нет, но требуется для отображения на Google Maps Н/Д Направление по компасу, в градусах, для центра изображения. Значение должно быть >= 0 и < 360. масштабирование/обрезка: Без изменений.
GPano:PosePitchDegrees Вещественное число Нет 0 Продольный наклон, в градусах, для центра изображения. Значение должно быть >= -90 и <= 90. масштабирование/обрезка: Без изменений.
GPano:PoseRollDegrees Вещественное число Нет 0 Поперечный наклон изображения, в градусах, где уровень горизонта равен 0. Значение должно быть > -180 и <= 180. масштабирование/обрезка: Без изменений.
GPano:InitialViewHeadingDegrees Целое число Нет 0 Курсовой угол для исходного представления, в градусах. масштабирование/обрезка: Без изменений.
GPano:InitialViewPitchDegrees Целое число Нет 0 Угол продольного наклона для исходного представления, в градусах. масштабирование/обрезка: Без изменений.
GPano:InitialViewRollDegrees Целое число Нет 0 Угол поперечного наклона для исходного представления, в градусах. масштабирование/обрезка: Без изменений.
GPano:InitialHorizontalFOVDegrees Вещественное число Нет Н/Д Исходное горизонтальное поле зрения, которое должно отобразить средство просмотра (в градусах). Аналогично уровню масштабирования. Н/Д
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. Замените все значения 4 000 и 2 000 соответствующими значения ширины и высоты вашего изображения в пикселях.
  2. Обновите свойство PoseHeadingDegrees, если хотите, чтобы Google Maps могли отобразить вашу сферическую панораму; в противном случае можно удалить данный параметр.
  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(-heading) * R_X(pitch) * R_Y(roll)

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

    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 = направление вверх, X = на восток, Y = на север.

Важно сохранить указанный порядок:

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

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

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

Справочные материалы

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