第二章:双目视觉基础

各位同学好,欢迎来到双目视觉的世界。这一章,咱们聊聊双目成像模型、对极几何、视差与深度的关系,还有相机标定。这些是后续所有融合算法的基础,说白了,就是地基。地基打不牢,后面盖的房子肯定歪。

2.1 双目成像模型

先说说双目成像模型。你想想看,人为什么有两只眼睛?因为一只眼睛看世界是二维的,两只眼睛才能感知深度。双目相机模仿的就是这个原理。

双目系统通常由两个相机组成,左右各一个。理想情况下,两个相机的光轴是平行的,成像平面也在同一个平面上。但实际中,哪有那么完美的事?我做过一个项目,左右相机装上去,发现光轴偏了大概0.5度。嗯,就这0.5度,后期标定费了不少功夫。

双目成像模型的核心,就是利用两个相机从不同角度拍摄同一场景,然后通过三角测量原理计算深度。说白了,就是已知两个相机的位置和姿态,再知道同一个点在左右图像上的像素位置,就能算出这个点的三维坐标。

核心公式:

深度 Z = (f * B) / d

其中:f 是焦距,B 是基线距离(两个相机光心之间的距离),d 是视差。

这个公式看着简单,但实际用起来坑不少。我刚开始做双目时,以为套公式就完事了,结果算出来的深度全是错的。后来才发现,f 的单位是像素,B 的单位是毫米,得统一才行。

2.2 对极几何

对极几何,听着挺吓人,其实没那么复杂。它解决的核心问题是:左图上的一个点,在右图上对应哪条线?

为什么会这样?因为一个三维点投影到左图后,它在右图上的对应点不可能出现在任意位置,而是被约束在一条直线上。这条线就叫极线。对极几何就是描述这种约束关系的数学工具。

我记得有一次做双目匹配,算法跑得特别慢。后来一查,发现是在全图搜索对应点。其实根本不用,沿着极线搜就行了,速度能快几十倍。这就是对极几何的实际价值。

对极几何有几个关键概念:

  • 极点:一个相机光心在另一个相机成像平面上的投影点
  • 极线:过极点和图像点的直线
  • 本质矩阵 E:描述两个相机之间的旋转和平移关系
  • 基础矩阵 F:本质矩阵加上相机内参,直接关联像素坐标

这里有个避坑指南:我曾经在标定后直接用本质矩阵做极线校正,结果发现校正后的图像歪歪扭扭。后来才意识到,本质矩阵需要配合内参才能得到基础矩阵,而基础矩阵才是直接对像素坐标起作用的。

2.3 视差与深度关系

视差,就是同一个三维点在左右图像上像素位置的差值。深度和视差成反比,这个关系很直观:物体越近,视差越大;物体越远,视差越小。

我给大家画个图,方便理解:

左相机 右相机 基线 B 三维点 P 左成像平面 右成像平面 x_left x_right 视差 d = x_left - x_right 深度 Z

从图上可以清楚看到,视差 d 就是 x_left 减去 x_right。深度 Z 越大,这个差值越小。当物体在无穷远时,视差趋近于零。

实际项目中,视差的计算精度直接影响深度精度。我做过一个测距项目,要求误差小于1%。算下来,视差误差必须控制在0.1像素以内。这可不是随便一个匹配算法能做到的。

经验之谈:

视差计算时,亚像素精度很重要。我一般用二次曲线拟合或者抛物线拟合,能把精度从整数像素提升到0.1像素级别。当然,代价是计算量增加了不少。

2.4 相机标定基础

相机标定,说白了就是确定相机的内参和外参。内参包括焦距、主点、畸变系数;外参包括旋转矩阵和平移向量。

标定的方法有很多,最常用的是张正友标定法。用棋盘格标定板,拍十几张不同角度的照片,然后解算参数。这个方法的好处是简单、稳定、精度高。

我给大家列一下标定的基本步骤:

  1. 打印棋盘格标定板,贴在平面上
  2. 用双目相机从不同角度拍摄标定板,至少10-15张
  3. 检测每张图片中的角点坐标
  4. 用张正友方法解算内参和畸变系数
  5. 用立体标定方法解算左右相机之间的外参
  6. 做立体校正,使左右图像行对齐

这里有个坑,我踩过好几次:标定板的平整度。如果标定板贴得不平,或者打印的棋盘格尺寸不准,标定结果会差很多。我曾经用一张皱巴巴的A4纸做标定,结果算出来的焦距偏差了5%。后来换了玻璃基板的标定板,问题才解决。

标定完成后,一般会得到以下参数:

参数 含义 典型值
fx, fy 焦距(像素单位) 500-2000
cx, cy 主点坐标 图像中心附近
k1, k2, k3 径向畸变系数 ±0.1以内
p1, p2 切向畸变系数 ±0.01以内
R 旋转矩阵(3x3) 接近单位矩阵
T 平移向量(3x1) 等于基线距离

重要提醒:

标定不是一劳永逸的。温度变化、机械振动、镜头松动都会导致标定参数漂移。我建议每隔3-6个月重新标定一次,或者在关键项目开始前做一次快速验证。

标定完成后,下一步就是立体校正。立体校正的目的是让左右图像的行对齐,这样匹配时只需要在同一行上搜索,大大降低计算量。校正后的图像,极线变成了水平线,对极几何就简化成了简单的行匹配问题。

嗯,这一章的内容就到这里。双目视觉的基础知识,说白了就是这些:成像模型告诉你相机怎么工作,对极几何告诉你匹配的约束条件,视差深度关系告诉你如何从二维信息恢复三维信息,相机标定则是这一切的前提。没有标定,后面的所有算法都是空中楼阁。

我个人觉得,学双目视觉最好的方法就是动手做一遍标定,然后写一个简单的视差计算程序。哪怕结果不完美,也比只看理论强得多。我在带团队时,新来的工程师我都会让他们先做一遍完整的标定流程,从拍照到解算到校正,全部自己动手。做完这个,后面学什么都快。


专注资料整理