此处描述的全景图片命名空间包含 有关全景照片制作和呈现的信息, 有时也称为全景图片 由 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。
- 更改出现的所有 4000 和 2000,以匹配图片的相应宽度和高度(以像素为单位)
- 如果您希望 Google 地图能够显示您的 360 度全景照片,请更新 PoseHeadingDegrees;则可以选择性地移除此参数
- 更新或移除可选参数(如上所列)
<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 度全景照片,而没有更新 元数据。此操作可通过以下步骤完成:
- 确保 CroppedAreaImageWidthPixels 标记等于图片的实际宽度
- 确保 CroppedAreaImageHeightPixels 标记等于图片的实际高度
- 如果步骤 1 或 2 失败,请检查是否已保留图片的宽高比
- 如果步骤 3 失败,请勿将此图片显示为全景照片,因为此图片已经以不兼容的方式转换,会导致严重的失真
- 如果步骤 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