第二章 立体视觉数学基础:坐标系与刚体变换、针孔相机模型、对极几何与基础矩阵

各位同学,欢迎来到第二章。说实话,这一章是整个立体视觉的“地基”。你想想看,如果连相机怎么成像、空间点怎么投影、两张图片之间是什么关系都搞不清楚,后面那些高大上的深度估计、三维重建,根本就是空中楼阁。

我个人习惯,在讲任何算法之前,先把数学工具捋顺。这就像做嵌入式开发,先看datasheet再看代码,否则容易翻车。好,我们开始。

2.1 坐标系与刚体变换

立体视觉里,我们打交道最多的就是坐标系。说白了,就是给三维空间里的点找个“户口本”。

常用的坐标系有四个:世界坐标系相机坐标系图像坐标系像素坐标系。它们之间通过刚体变换和投影变换联系起来。

刚体变换,就是旋转加平移。物体不会变形,只是换个位置和姿势。数学上用一个旋转矩阵 R 和一个平移向量 t 表示:

P_cam = R * P_world + t

这里 P_world 是世界坐标系下的点,P_cam 是相机坐标系下的点。R 是 3x3 的正交矩阵,t 是 3x1 的向量。

我的小经验: 实际项目中,R 矩阵很容易因为标定误差而不严格正交。我建议每次拿到 R 之后,用 SVD 分解强制正交化一下。我曾经因为这个吃过亏,重建出来的点云全是扭曲的。

为了计算方便,我们通常用齐次坐标,把旋转和平移合并成一个 4x4 的变换矩阵:

| P_cam |   =   | R  t |   *   | P_world |
|   1   |       | 0  1 |       |    1    |

嗯,这里要注意:齐次坐标的最后一维是1,表示点;如果是0,表示方向向量。方向向量只旋转,不平移。

2.2 针孔相机模型

针孔相机模型,是所有相机模型的“老祖宗”。虽然现在的相机镜头复杂得很,但基本原理还是这个。

简单说,就是三维空间中的点,通过光心投影到成像平面上。数学表达式如下:

u = f * X / Z + u0
v = f * Y / Z + v0

其中 (X, Y, Z) 是相机坐标系下的三维点,(u, v) 是像素坐标,f 是焦距(单位是像素),(u0, v0) 是主点坐标。

写成矩阵形式更优雅:

s * | u |   =   | f  0  u0  0 |   *   | X |
    | v |       | 0  f  v0  0 |       | Y |
    | 1 |       | 0  0   1  0 |       | Z |
                                       | 1 |

这个 3x4 的矩阵,就是内参矩阵 K 加上一列零。内参矩阵 K 是相机自己的“身份证”,每个相机都不一样。

避坑指南: 我曾经在项目中直接用厂家给的标定参数,结果发现图像边缘的畸变校正后还是有偏差。后来才意识到,针孔模型假设镜头是理想的,但实际镜头有径向畸变和切向畸变。一定要做畸变校正,尤其是用广角镜头的时候。

完整的投影过程,从世界坐标到像素坐标,可以写成:

s * p_pixel = K * [R | t] * P_world

这里的 [R | t] 就是相机的外参,表示相机在世界坐标系中的位姿。

2.3 对极几何与基础矩阵

好,现在我们有了一台相机。但立体视觉需要两台相机(或者一台相机移动两次)。两张图片之间有什么关系?这就是对极几何要回答的问题。

对极几何的核心思想是:左图中的一个点,在右图中对应的点一定在一条直线上。这条线叫“极线”。

为什么会这样?你想想看,左图中的一个点,对应的是三维空间中的一条射线。这条射线在右相机中成像,就是一条直线。所以搜索匹配点的时候,不用全图搜索,沿着极线找就行了。这能省多少计算量啊!

数学上,这个关系用基础矩阵 F 来描述:

p_right^T * F * p_left = 0

其中 p_left 和 p_right 是左右图像中对应点的齐次坐标。F 是一个 3x3 的矩阵,秩为2。

基础矩阵 F 包含了两个相机的内参和相对位姿信息。如果已知内参,我们可以得到本质矩阵 E

E = K_right^T * F * K_left

本质矩阵 E 只包含旋转和平移信息,不包含内参。从 E 可以分解出 R 和 t,这就是立体视觉中“标定”和“外参估计”的核心。

关键点总结:
  • 基础矩阵 F:7 自由度,适用于未标定的相机
  • 本质矩阵 E:5 自由度,适用于已标定的相机
  • 从 E 分解 R 和 t 时,会有四种可能的解,需要用“点在相机前方”的约束来筛选

我记得第一次手动实现从 E 分解 R 和 t 的时候,折腾了一整天。四种解里只有一个是正确的,判断条件就是:重建出来的三维点必须在两个相机的前方。这个约束看似简单,但代码里很容易漏掉。

2.4 本章知识体系

下面我用一张图来总结本章的核心逻辑。这张图是我自己画的,希望能帮你把知识点串起来。

立体视觉数学基础 - 知识体系 世界坐标系 P_world (X, Y, Z) 刚体变换 R, t (4x4矩阵) 相机坐标系 P_cam (Xc, Yc, Zc) 外参 旋转+平移 针孔相机模型 内参矩阵 K 投影 像素坐标 p (u, v) 畸变校正 对极几何 极线约束 基础矩阵 F p_right^T * F * p_left = 0 本质矩阵 E E = K^T * F * K 包含内参 去除内参 核心流程:世界坐标 → 刚体变换 → 相机坐标 → 针孔投影 → 像素坐标

这张图从左到右,从上到下,展示了从三维世界到二维图像的完整流程,以及两张图像之间的几何关系。你可以在脑子里过一遍:一个三维点,先经过刚体变换到相机坐标系,再通过针孔模型投影到像素平面。如果是双目系统,两个像素点之间还要满足对极几何约束。

我的建议: 初学者最容易犯的错误是把坐标系搞混。我自己的习惯是,在代码里用变量名明确标注坐标系,比如 pt_worldpt_campt_pixel。这样调试的时候一眼就能看出问题出在哪一步。

好,这一章的内容就到这里。数学基础打牢了,后面讲立体匹配、深度估计的时候,你会觉得顺滑很多。记住,坐标系是骨架,相机模型是肌肉,对极几何是神经——三者缺一不可。


公众号:蓝海资料掘金营,微信deep3321