第二章 立体视觉数学基础:坐标系与刚体变换、针孔相机模型、对极几何与基础矩阵
各位同学,欢迎来到第二章。说实话,这一章是整个立体视觉的“地基”。你想想看,如果连相机怎么成像、空间点怎么投影、两张图片之间是什么关系都搞不清楚,后面那些高大上的深度估计、三维重建,根本就是空中楼阁。
我个人习惯,在讲任何算法之前,先把数学工具捋顺。这就像做嵌入式开发,先看datasheet再看代码,否则容易翻车。好,我们开始。
2.1 坐标系与刚体变换
立体视觉里,我们打交道最多的就是坐标系。说白了,就是给三维空间里的点找个“户口本”。
常用的坐标系有四个:世界坐标系、相机坐标系、图像坐标系、像素坐标系。它们之间通过刚体变换和投影变换联系起来。
刚体变换,就是旋转加平移。物体不会变形,只是换个位置和姿势。数学上用一个旋转矩阵 R 和一个平移向量 t 表示:
P_cam = R * P_world + t
这里 P_world 是世界坐标系下的点,P_cam 是相机坐标系下的点。R 是 3x3 的正交矩阵,t 是 3x1 的向量。
为了计算方便,我们通常用齐次坐标,把旋转和平移合并成一个 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 本章知识体系
下面我用一张图来总结本章的核心逻辑。这张图是我自己画的,希望能帮你把知识点串起来。
这张图从左到右,从上到下,展示了从三维世界到二维图像的完整流程,以及两张图像之间的几何关系。你可以在脑子里过一遍:一个三维点,先经过刚体变换到相机坐标系,再通过针孔模型投影到像素平面。如果是双目系统,两个像素点之间还要满足对极几何约束。
pt_world、pt_cam、pt_pixel。这样调试的时候一眼就能看出问题出在哪一步。
好,这一章的内容就到这里。数学基础打牢了,后面讲立体匹配、深度估计的时候,你会觉得顺滑很多。记住,坐标系是骨架,相机模型是肌肉,对极几何是神经——三者缺一不可。
公众号:蓝海资料掘金营,微信deep3321