透视投影中为何需对相机/世界坐标使用齐次坐标?
首先得明确:不是非要转,但转成齐次坐标是计算机视觉领域里统一变换逻辑、提升工程效率的最优选择,这也是为啥所有资料都用第一种齐次形式的原因。
1. 把所有坐标变换统一成线性操作
相机成像的完整流程从来不是只做透视投影:从世界坐标到相机坐标要做旋转+平移,相机坐标到图像坐标要做内参投影。如果用非齐次坐标,旋转是线性乘法,但平移是加法,没法合并成一个操作;而齐次坐标能把旋转+平移打包成一个4×4的变换矩阵,和相机内参的3×4矩阵相乘后,直接得到从世界坐标到图像齐次坐标的单矩阵——整个流程除了最后一步的归一化,全是矩阵乘法,代码写起来简洁,计算起来还能靠GPU加速。
要是用你提到的第二种非齐次形式,每次变换都要分开算加法、乘法、除法,不仅代码冗余,处理批量点的时候效率差很多。
2. 把透视投影的非线性操作标准化
透视投影的核心是“除以z”(近大远小的本质),这个操作本身是非线性的,但齐次坐标能把它转化成“齐次坐标转非齐次坐标”的标准步骤:相机齐次坐标[x, y, z, 1]和内参矩阵相乘后得到图像齐次坐标[fx*x + cx*z, fy*y + cy*z, z],最后把前两个分量除以第三个分量z,就得到了像素坐标(ux, uy)。
这么做的好处是,不管是平移、旋转还是投影,所有变换逻辑都能套进“矩阵乘法”的框架里,不用单独写除法的逻辑,工程实现上不容易出错。
3. 兼容特殊场景的需求
齐次坐标能表示非齐次坐标没法处理的情况,比如无穷远点(比如平行光的方向),这在相机校准、立体匹配、SLAM这些领域里是很常见的需求。用非齐次坐标的话,z=0的时候除法直接报错,但齐次坐标可以用[x, y, 0, 1]来表示无穷远点,完美解决这个问题。
说白了,虽然单独看透视投影确实能写成非齐次的形式,但齐次坐标是把整个计算机视觉的坐标变换体系给统一了,从理论到工程都更顺畅,这才是行业通用的选择。
内容的提问来源于stack exchange,提问作者Hui Liu

