如何将球面坐标转换为equirectangular投影坐标?

时间:2017-05-02 15:34:12

标签: image-processing camera coordinates projection coordinate-systems

简化问题

如何将spherical coordinate(θ,φ)转换为equirectangular projection上的位置(x,y)(也称为“地理投影”)?

其中:

  • x是经度,水平位置,从-180到180度。
  • y是纬度,垂直位置,从-90到90度。
  • θ是theta,以度为单位的水平角度,从(0,0,0)到球体表面上的点的矢量。
  • φ是phi,垂直角度,从(0,0,0)到球体表面上的点的矢量。

下面你会找到原来的问题,当我不能很好地理解这个问题时,我认为它仍然有助于展示这个解决方案的实际应用。

上下文

编辑:原始问题标题是:如何以给定角度转换照片以成为全景照片的一部分?

如果我想要以任何给定角度拍摄的照片变换我可以将得到的(扭曲/变形的)图像放置在等距矩形投影上的相应特定位置,任何人都可以帮助我采取哪些步骤,立方体贴图或任何全景照片投影?

哪种投影最容易做到就足够了,因为有很多关于如何在不同投影之间进行转换的资源。我只是不知道如何从实际照片到这样的投影步骤。

可以安全地假设相机将停留在固定位置,并可以从那里向任何方向旋转。我认为需要这样做的数据可能是这样的:

  • 物理相机的水平角度[-180, +180](例如+ 140deg)。
  • 物理相机的垂直角度[-90, +90](例如-30deg)。
  • 照片w x h的分辨率(例如1280x720像素)。
  • 照片的水平角度(例如70度)。
  • 照片的垂直角度(例如40度)。
  • 镜头校正a,b,c参数(见下文)。

我有这些数据,我猜第一步是进行镜头校正,以便所有应该笔直的线条实际上是直的。这可以使用imagemagick的{​​{3}}来完成,您只需要填写三个参数:a,b和c。应用于图像以纠正此问题的转换非常简单。

我被困在下一步。要么我不完全理解它,要么搜索引擎没有帮助我,因为大多数结果都是关于在已经给定的投影之间进行转换,或者使用高级应用程序将照片智能地拼接在一起。这些结果并没有帮助我回答我的问题。

编辑:我认为也许一个数字可以帮助更好地解释它:)

问题是给定的照片红色无法在没有变换的情况下放入equirectangular投影中。下图说明了问题。

Barrel Distortion

所以,我有红色,我需要将其转换为绿色蓝色显示转换的差异,但这取决于水平/垂直角度。

2 个答案:

答案 0 :(得分:4)

如果从固定点拍摄照片,则相机只能旋转其偏航并绕该点旋转。然后我们可以考虑任意半径的球体(对于数学,强烈建议使用半径为1)。照片将是球体上的矩形形状(从相机的角度来看)。

地平线情况

如果您正在观察地平线(赤道),则垂直像素会占据纬度,水平像素会占经度。对于地平线的简单全景照片,没有太大问题:

Looking at the wireframe of the geo-sphere from (0,0,0)

在这里,我们大致看看我们世界的视野。也就是说,相机具有角度va = ~0。然后这非常简单,因为如果我们知道照片是70度宽和40度高,那么我们也知道经度范围大约是70度,纬度范围是40度。

如果我们不关心轻微的失真,那么从照片中的任何像素(longitude,latitude)计算(x,y)的公式都很容易:

photo_width_deg = 70
photo_height_deg = 30
photo_width_px = 1280
photo_height_px = 720
ha = 0
va = 0
longitude = photo_width_deg * (x - photo_width_px/2) / photo_width_px + ha
latitude = photo_height_deg * (y - photo_height_px/2) / photo_height_px + va

问题

但是当我们更垂直地移动相机时,这种近似并不起作用:

Looking at the wireframe of the geo-sphere from (0,0,0)

那么,考虑到拍摄照片的垂直/水平角度,我们如何将像素从(x, y)的图片转换为(longitude, latitude)坐标?{/ p>

解决方案

解决问题的重要思想是:你基本上有两个领域

  • Photo-sphere ,相机位于中央。
  • geo-sphere (equirectangular投影球),带有经度/纬度坐标。

你知道光球上一个点的球面坐标,你想知道这个点在具有不同摄像机角度的地球球体上的位置。

真正的问题

我们必须意识到仅使用spherical coordinates 难以在两个领域之间进行任何计算cartesian coordinate system的数学运算要简单得多。在笛卡尔坐标系中,我们可以使用rotation matrices轻松围绕任何轴旋转,并与坐标向量(va,ha)相乘,以获得旋转坐标。

警告:[x,y,z] - 轴,x的含义中,了解有不同的约定非常重要-axis和y - 轴。不确定哪个轴是垂直轴,哪个轴指向哪里。你只需要自己画一幅画并做出决定。如果结果是错误的,可能是因为它们混淆了。对于球坐标,ztheta也是如此。

真正的解决方案

所以诀窍是从光球转换为笛卡儿,然后应用旋转,然后返回球面坐标

  1. 拍摄照片上的任何像素,并计算水平和垂直方向远离照片中心的相对度数。
  2. 将Photo-sphere球面坐标转换为笛卡尔坐标(phi向量)。
  3. 将旋转矩阵应用于坐标,就像旋转相机[x,y,z]
  4. 一样
  5. 将笛卡尔坐标转换回球面坐标,这些将是您的经度和纬度。
  6. 示例代码

    (ha,va)

    注意,这只是某种伪代码。建议使用矩阵库来处理矩阵和向量的乘法和旋转。

答案 1 :(得分:1)

嗯,我想也许你应该退后一步。 考虑你的相机角度(70mm左右)。 但你的背景图像是水平360度(但也是垂直的)。 考虑两种类型图片的透视扭曲。 对于背景图,在垂直意义上只有地平线不会垂直扭曲。可悲的是它只是一条细线。 随着失真的增加,你越往上到下。

它与桶形失真不一样,但它取决于地平线的垂直距离。

我认为实现差异的最佳方法是从侧面观察两种类型的相机和它们应该投射的目标,从那里得到三角学,数学。

请注意,对于70毫米的图片,您需要知道拍摄的角度。 (或估计)