全景照片 XMP 元数据

此处描述的全景图片命名空间包含 有关全景照片制作和呈现的信息, 有时也称为全景图片 由 Android 4.2 相机中的 Photo Sphere 功能制作而成的图片通过 元数据应进行序列化,并嵌入到 360 度全景照片中, 具体说明 Adobe XMP 标准(请参阅本页末尾的参考文档)。

命名空间 URI 为 http://ns.google.com/photos/1.0/panorama/

元数据属性

下面的图表显示了由 GPano 参数。编辑和查看全景照片时,请务必 验证和更新元数据,如本文档后面部分所述。 在指定姿势和初始方向字段时,请务必遵循 欧拉角约定(稍后 本文档。

请注意,Google 产品仅支持球面投影。 目前只有其他厂商的产品支持其他投影方式。

球面投影

圆柱投影

请注意,如果圆柱形图片的顶部高于地平线, CroppedAreaTopPixels 必须为负数。CroppedAreaTopPixels 的值为 0 会将图像顶部与地平线对齐。正值 CroppedAreaTopPixels 会将图片的顶部放置在地平线下方。

GPano 参数参考

名称 类型 必填 默认值
(假设存在查看器)
属性说明 图片修改后需要执行的操作
GPano:UsePanoramaViewer 布尔值 正确 是在全景照片查看器中显示此图片,还是作为正常的平面图片显示。这可能需要根据用户偏好或通过拼接软件指定。显示或提取图片的应用可以选择忽略此属性。 缩放/剪裁:
没有变化。如果视野范围低于特定值,应用可能会决定将此属性切换为 False。
GPano:CaptureSoftware 字符串 不适用 如果使用移动设备(例如 Android 手机)上的应用完成拍摄,则为所使用的应用的名称(例如“Photo Sphere”)。如果源图片为手动拍摄(例如使用三脚架上的数码单反相机),则应将其留空。 不适用
GPano:StitchingSoftware 字符串 不适用 用于创建最终的 360 度全景照片的软件。该参数有时与 GPano:CaptureSoftware 的值相同。 不适用
GPano:ProjectionType 自由选择文本

等距矩形

图片文件中使用的投影类型。Google 产品目前仅支持“equirectangular”这个值。 缩放/剪裁:没有变化。
GPano:PoseHeadingDegrees 实数 否,但在 Google 地图上显示时需要 不适用 罗盘航向,以与北方所呈顺时针角度来表示,以图片中心为基准。值必须大于等于 0 且小于360。 缩放/剪裁:没有变化。
GPano:PosePitchDegrees 实数 0 针对图片中心的俯仰角,以高于地平线的度数为单位。值必须大于等于 -90 且小于等于 90。 缩放/剪裁:没有变化。
GPano:PoseRollDegrees 实数 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 日期 不适用 在 360 度全景照片中创建的第一张图片的日期和时间。 缩放/剪裁:没有变化。
GPano:LastPhotoDate 日期 不适用 在 360 度全景照片中创建的最后一张图片的日期和时间。 缩放/剪裁:没有变化。
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. 如果您希望 Google 地图能够显示您的 360 度全景照片,请更新 PoseHeadingDegrees;则可以选择性地移除此参数
  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>

图片编辑的稳健性

为确保稳健性,在查看器中显示 360 度全景照片的程序应检查 应用程序已缩放原始 360 度全景照片,而没有更新 元数据。此操作可通过以下步骤完成:

  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) 是围绕指定轴的右向旋转:











其中 Z = 向上,X = 东,Y = 北。

请务必保持以下顺序:

R = R_Z(方向角) * R_X(音高) * R_Y(方向角)

因为旋转是不可交换的。

请注意,航向角与标准罗盘航向角相同。

参考

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