第二章:双目视觉基础
各位同学好,欢迎来到双目视觉的世界。这一章,咱们聊聊双目成像模型、对极几何、视差与深度的关系,还有相机标定。这些是后续所有融合算法的基础,说白了,就是地基。地基打不牢,后面盖的房子肯定歪。
2.1 双目成像模型
先说说双目成像模型。你想想看,人为什么有两只眼睛?因为一只眼睛看世界是二维的,两只眼睛才能感知深度。双目相机模仿的就是这个原理。
双目系统通常由两个相机组成,左右各一个。理想情况下,两个相机的光轴是平行的,成像平面也在同一个平面上。但实际中,哪有那么完美的事?我做过一个项目,左右相机装上去,发现光轴偏了大概0.5度。嗯,就这0.5度,后期标定费了不少功夫。
双目成像模型的核心,就是利用两个相机从不同角度拍摄同一场景,然后通过三角测量原理计算深度。说白了,就是已知两个相机的位置和姿态,再知道同一个点在左右图像上的像素位置,就能算出这个点的三维坐标。
核心公式:
深度 Z = (f * B) / d
其中:f 是焦距,B 是基线距离(两个相机光心之间的距离),d 是视差。
这个公式看着简单,但实际用起来坑不少。我刚开始做双目时,以为套公式就完事了,结果算出来的深度全是错的。后来才发现,f 的单位是像素,B 的单位是毫米,得统一才行。
2.2 对极几何
对极几何,听着挺吓人,其实没那么复杂。它解决的核心问题是:左图上的一个点,在右图上对应哪条线?
为什么会这样?因为一个三维点投影到左图后,它在右图上的对应点不可能出现在任意位置,而是被约束在一条直线上。这条线就叫极线。对极几何就是描述这种约束关系的数学工具。
我记得有一次做双目匹配,算法跑得特别慢。后来一查,发现是在全图搜索对应点。其实根本不用,沿着极线搜就行了,速度能快几十倍。这就是对极几何的实际价值。
对极几何有几个关键概念:
- 极点:一个相机光心在另一个相机成像平面上的投影点
- 极线:过极点和图像点的直线
- 本质矩阵 E:描述两个相机之间的旋转和平移关系
- 基础矩阵 F:本质矩阵加上相机内参,直接关联像素坐标
这里有个避坑指南:我曾经在标定后直接用本质矩阵做极线校正,结果发现校正后的图像歪歪扭扭。后来才意识到,本质矩阵需要配合内参才能得到基础矩阵,而基础矩阵才是直接对像素坐标起作用的。
2.3 视差与深度关系
视差,就是同一个三维点在左右图像上像素位置的差值。深度和视差成反比,这个关系很直观:物体越近,视差越大;物体越远,视差越小。
我给大家画个图,方便理解:
从图上可以清楚看到,视差 d 就是 x_left 减去 x_right。深度 Z 越大,这个差值越小。当物体在无穷远时,视差趋近于零。
实际项目中,视差的计算精度直接影响深度精度。我做过一个测距项目,要求误差小于1%。算下来,视差误差必须控制在0.1像素以内。这可不是随便一个匹配算法能做到的。
经验之谈:
视差计算时,亚像素精度很重要。我一般用二次曲线拟合或者抛物线拟合,能把精度从整数像素提升到0.1像素级别。当然,代价是计算量增加了不少。
2.4 相机标定基础
相机标定,说白了就是确定相机的内参和外参。内参包括焦距、主点、畸变系数;外参包括旋转矩阵和平移向量。
标定的方法有很多,最常用的是张正友标定法。用棋盘格标定板,拍十几张不同角度的照片,然后解算参数。这个方法的好处是简单、稳定、精度高。
我给大家列一下标定的基本步骤:
- 打印棋盘格标定板,贴在平面上
- 用双目相机从不同角度拍摄标定板,至少10-15张
- 检测每张图片中的角点坐标
- 用张正友方法解算内参和畸变系数
- 用立体标定方法解算左右相机之间的外参
- 做立体校正,使左右图像行对齐
这里有个坑,我踩过好几次:标定板的平整度。如果标定板贴得不平,或者打印的棋盘格尺寸不准,标定结果会差很多。我曾经用一张皱巴巴的A4纸做标定,结果算出来的焦距偏差了5%。后来换了玻璃基板的标定板,问题才解决。
标定完成后,一般会得到以下参数:
| 参数 | 含义 | 典型值 |
|---|---|---|
| fx, fy | 焦距(像素单位) | 500-2000 |
| cx, cy | 主点坐标 | 图像中心附近 |
| k1, k2, k3 | 径向畸变系数 | ±0.1以内 |
| p1, p2 | 切向畸变系数 | ±0.01以内 |
| R | 旋转矩阵(3x3) | 接近单位矩阵 |
| T | 平移向量(3x1) | 等于基线距离 |
重要提醒:
标定不是一劳永逸的。温度变化、机械振动、镜头松动都会导致标定参数漂移。我建议每隔3-6个月重新标定一次,或者在关键项目开始前做一次快速验证。
标定完成后,下一步就是立体校正。立体校正的目的是让左右图像的行对齐,这样匹配时只需要在同一行上搜索,大大降低计算量。校正后的图像,极线变成了水平线,对极几何就简化成了简单的行匹配问题。
嗯,这一章的内容就到这里。双目视觉的基础知识,说白了就是这些:成像模型告诉你相机怎么工作,对极几何告诉你匹配的约束条件,视差深度关系告诉你如何从二维信息恢复三维信息,相机标定则是这一切的前提。没有标定,后面的所有算法都是空中楼阁。
我个人觉得,学双目视觉最好的方法就是动手做一遍标定,然后写一个简单的视差计算程序。哪怕结果不完美,也比只看理论强得多。我在带团队时,新来的工程师我都会让他们先做一遍完整的标定流程,从拍照到解算到校正,全部自己动手。做完这个,后面学什么都快。