代码之家  ›  专栏  ›  技术社区  ›  Hui Liu

为什么在透视投影过程中需要使用齐次坐标作为相机/世界坐标?

  •  0
  • Hui Liu  · 技术社区  · 5 月前

    我明白,为了将相机坐标系(3d)中的一个点投影到图像坐标系(2d)上,我们需要使用齐次坐标作为图像坐标,这样我们就可以使用线性矩阵乘法。但是为什么我们还需要更改相机坐标呢?具体来说,我在很多笔记中看到的透视投影是这样的: enter image description here

    但为什么不这样呢? enter image description here

    (这里,ux、uy是像素坐标,x、y、z是相机坐标)

    1 回复  |  直到 5 月前
        1
  •  0
  •   chrslg    5 月前

    当然,如果你确定矩阵与你的例子一样,并且3d齐次坐标为(xc,yc,zc,1),那么很明显,你的(33)(3)矩阵乘法的结果与(34)(4)矩阵乘法相同。

    但一般来说,相机系统中3D点的(4)原点坐标可能不具有(xc,yc,zc,1)的形式。

    例如,因为它可以来自另一个射影几何变换。并不是所有这些都以1作为第四个组成部分。

    互联网上的大量教程和文档似乎表明,齐次坐标的全部意义在于允许在单个线性操作中组合一些旋转和平移(换句话说,使用线性操作来执行仿射操作)。但这还不是全部。投影变换允许一些投影,而不仅仅是相机图像上的投影。 例如,您可能需要使用2个摄像头(立体视觉)。你可以知道你在相机上看到的恰好是你3D世界中的2D图像(例如,你的相机看到的墙上的海报图像),并根据其他投影变换计算3D坐标。

    所以,换句话说,你的(xc,yc,zc,1)很可能是(xc、yc、zc,12)。这与(xc,yc,zc,1)完全不同(它与(xc/12,yc/12,zc/12,1)相同)

    当然,在相机坐标系中,对于你玩的投影,结果恰好是相同的。但是,仅仅因为知道结果恰好相同而删除最后一个组件,就有点期待操作本身。

    一个特别的例子:你如何投影一个无穷大的点,在方向(1,2,3)上? 该点不是3d非齐次坐标(不能编码无穷大)。但具有三维齐次坐标(1,2,3,0)

    当然,由于其结果是(fx+3ox,2fy+3oy,3)aka((fx+3ox)/3,(2fy+3oy/3,1),这恰好与3D中点(1,2,3,1)aka(1,2,3)的投影结果相同,你可能会认为使用齐次坐标是一种不必要的复杂化。但这是因为你碰巧知道(1,2,3,1)和(1,2,3,4-0)这两个非常不同的点(一个是离相机很近的点,另一个是天空中的恒星)恰好有相同的投影。所以,你的近似值之所以有效,是因为你知道结果。

    但在现实生活中,我们从来不会只使用一个操作。在现实生活中,你将这个矩阵与其他矩阵组合在一起,得到一个聚合的3x4矩阵,它没有0列,这让你认为你可以简单地忽略第四个分量,因为结果对它是不变的。