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

问题描述 投票:0回答:1

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

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

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

computer-vision camera-calibration
1个回答
0
投票

当然,如果您确定矩阵如示例中所示,并且 3d 齐次坐标为 (xc, yc, zc, 1),那么,显然是 (3×3)×(3) 矩阵乘法的结果与 (3×4)×(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 非齐次坐标(无法编码无穷大)。但具有 3d 齐次坐标 (1,2,3,0)

当然,因为结果是 (fx+3ox, 2fy+3oy, 3) 又名 ((fx+3ox)/3, (2fy+3oy)/3, 1),这恰好与以下结果相同点 (1,2,3,1) 又名 (1,2,3) 在 3D 中的投影,您可能会认为使用齐次坐标是不必要的复杂化。但这是因为你碰巧知道 (1,2,3,1) 和 (1,2,3,0),它们是非常不同的点(一个是离相机很近的点,另一个是离相机很近的点)天空中的星星),恰好有相同的投影。因此,您的近似值仅有效,因为您知道结果。

但在现实生活中,我们永远不会单独使用单个操作。在现实生活中,您将此矩阵与其他矩阵组合,以获得聚合的 3x4 矩阵,该矩阵没有 0 列,这使您认为可以简单地忽略第四个分量,因为结果对其不变。

© www.soinside.com 2019 - 2024. All rights reserved.