如何将spherical coordinate(θ,φ)转换为equirectangular projection上的位置(x,y)(也称为“地理投影”)?
其中:
下面你会找到原来的问题,当我不能很好地理解这个问题时,我认为它仍然有助于展示这个解决方案的实际应用。
编辑:原始问题标题是:如何以给定角度转换照片以成为全景照片的一部分?
如果我想要以任何给定角度拍摄的照片变换我可以将得到的(扭曲/变形的)图像放置在等距矩形投影上的相应特定位置,任何人都可以帮助我采取哪些步骤,立方体贴图或任何全景照片投影?
哪种投影最容易做到就足够了,因为有很多关于如何在不同投影之间进行转换的资源。我只是不知道如何从实际照片到这样的投影步骤。
可以安全地假设相机将停留在固定位置,并可以从那里向任何方向旋转。我认为需要这样做的数据可能是这样的:
[-180, +180]
(例如+ 140deg)。[-90, +90]
(例如-30deg)。w x h
的分辨率(例如1280x720像素)。我有这些数据,我猜第一步是进行镜头校正,以便所有应该笔直的线条实际上是直的。这可以使用imagemagick
的{{3}}来完成,您只需要填写三个参数:a,b和c。应用于图像以纠正此问题的转换非常简单。
我被困在下一步。要么我不完全理解它,要么搜索引擎没有帮助我,因为大多数结果都是关于在已经给定的投影之间进行转换,或者使用高级应用程序将照片智能地拼接在一起。这些结果并没有帮助我回答我的问题。
编辑:我认为也许一个数字可以帮助更好地解释它:)
问题是给定的照片红色无法在没有变换的情况下放入equirectangular投影中。下图说明了问题。
所以,我有红色,我需要将其转换为绿色。 蓝色显示转换的差异,但这取决于水平/垂直角度。
答案 0 :(得分:4)
如果从固定点拍摄照片,则相机只能旋转其偏航并绕该点旋转。然后我们可以考虑任意半径的球体(对于数学,强烈建议使用半径为1)。照片将是球体上的矩形形状(从相机的角度来看)。
如果您正在观察地平线(赤道),则垂直像素会占据纬度,水平像素会占经度。对于地平线的简单全景照片,没有太大问题:
在这里,我们大致看看我们世界的视野。也就是说,相机具有角度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
但是当我们更垂直地移动相机时,这种近似并不起作用:
那么,考虑到拍摄照片的垂直/水平角度,我们如何将像素从(x, y)
的图片转换为(longitude, latitude)
坐标?{/ p>
解决问题的重要思想是:你基本上有两个领域:
你知道光球上一个点的球面坐标,你想知道这个点在具有不同摄像机角度的地球球体上的位置。
我们必须意识到仅使用spherical coordinates 难以在两个领域之间进行任何计算。 cartesian coordinate system的数学运算要简单得多。在笛卡尔坐标系中,我们可以使用rotation matrices轻松围绕任何轴旋转,并与坐标向量(va,ha)
相乘,以获得旋转坐标。
警告:在[x,y,z]
- 轴,x
的含义中,了解有不同的约定非常重要-axis和y
- 轴。不确定哪个轴是垂直轴,哪个轴指向哪里。你只需要自己画一幅画并做出决定。如果结果是错误的,可能是因为它们混淆了。对于球坐标,z
和theta
也是如此。
所以诀窍是从光球转换为笛卡儿,然后应用旋转,然后返回球面坐标:
phi
向量)。[x,y,z]
。(ha,va)
注意,这只是某种伪代码。建议使用矩阵库来处理矩阵和向量的乘法和旋转。
答案 1 :(得分:1)
它与桶形失真不一样,但它取决于地平线的垂直距离。
我认为实现差异的最佳方法是从侧面观察两种类型的相机和它们应该投射的目标,从那里得到三角学,数学。
请注意,对于70毫米的图片,您需要知道拍摄的角度。 (或估计)