Photo Sphere XMP Metadata

此处所述的全景命名空间包含提供关于创建和渲染照片球(有时也称为全景照片)信息的属性,如通过 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 产品目前支持值 equirectangular。 缩放/裁剪:没有变化。
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 初始视图的滚转角,以度为单位。 缩放/裁剪:没有变化。
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. 更改出现的任何 4000 和 2000,以匹配对应的图像宽度和高度(以像素表示)
  2. 如果您需要 Google 地图能够显示您的照片球,则更新 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>

图像编辑的稳健性

为保证稳健性,在查看器中显示照片球的程序应检查原始照片球是否已在未更新元数据的情况下通过某个应用进行了缩放。

此操作可通过以下步骤完成:

  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 = Up, X = East, Y = North.

保留此顺序很重要:

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

因为旋转是不可交换的。

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

引用

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