立体视觉基础:双目相机成像原理、极线约束、视差与深度的关系、相机标定与校正
立体匹配(Stereo Matching)的核心任务是从一对双目图像中恢复场景的深度信息。要真正理解代价计算、聚合与后处理为何如此设计,首先必须牢固掌握双目视觉的物理与几何基础。本章将围绕四个关键主题展开:双目相机的成像原理、极线约束如何简化匹配搜索、视差与深度的数学转换关系,以及相机标定与校正(立体校正)在工程链路中的关键作用。这些内容不仅是算法实现的前提,更是排查“匹配错误”“深度噪声大”“图像畸变”等实际问题的第一现场。
2.1 双目相机成像原理:从三维世界到二维像素
双目相机模拟人眼感知深度的方式,通过两个水平放置的相机同时采集同一场景。每个相机遵循针孔成像模型,将三维空间点投影到二维图像平面。设左相机光心为世界坐标系原点,右相机光心位于基线距离 b 处。空间点 P(X, Y, Z) 在左右成像面上的投影点分别为 xL 和 xR。由于两个相机视角不同,同一空间点在左右图像中的像素位置存在水平偏移,这个偏移量就是视差 d = xL - xR。
实际工程中,相机并非理想针孔模型,镜头畸变(径向畸变和切向畸变)会导致投影点偏离理论位置。径向畸变使直线成像为曲线,切向畸变源于镜头与成像面不平行。因此,原始图像必须经过畸变校正才能用于立体匹配。此外,双目相机的两个镜头在制造装配时难以做到完全平行,存在旋转和平移误差,这需要通过立体校正将左右图像变换为“理想双目系统”下的图像,使对应点的极线严格水平对齐。
2.2 极线约束:将二维搜索降为一维搜索
极线约束是立体视觉中最核心的几何约束。对于左图像上的任意一点 pL,其在右图像上的对应点 pR 必然位于一条直线上,这条直线称为极线。极线的几何定义是:由左相机光心 OL、右相机光心 OR 和空间点 P 三点确定的平面(极平面)与右成像平面的交线。所有极线交于极点(左右光心连线与成像平面的交点)。
在未校正的原始双目图像中,极线是倾斜的,匹配搜索需要在二维区域内进行,计算量大且容易产生误匹配。通过立体校正(如 Bouguet 算法),可以将左右图像重投影到共同平面上,使极线变为水平线。此时,左图点 pL 的对应点只需在右图的同一行(y 坐标相同)上搜索,搜索空间从二维降为一维,时间复杂度从 O(W×H) 降为 O(W),同时误匹配率显著降低。
| 对比维度 | 未校正图像 | 立体校正后 |
|---|---|---|
| 极线方向 | 任意倾斜方向 | 严格水平 |
| 搜索空间 | 2D 区域(全图或局部窗口) | 1D 水平线(同一行) |
| 计算复杂度 | O(W×H) 每像素 | O(W) 每像素 |
| 误匹配风险 | 高(易受纹理重复干扰) | 低(几何约束强) |
| 后续处理 | 需额外几何验证 | 可直接进行视差计算 |
极线约束的工程意义不仅在于加速,更在于鲁棒性。在遮挡区域、低纹理区域或重复纹理区域,一维搜索配合唯一性约束(每个像素最多一个匹配)能有效减少歧义。实际系统中,立体校正的精度直接影响匹配质量,通常要求校正后极线水平误差小于 0.5 像素。
2.3 视差与深度的关系:数学转换与精度分析
在理想双目系统中,深度 Z 与视差 d 的关系为:Z = f × b / d,其中 f 为焦距(像素单位),b 为基线距离(毫米单位),d 为视差(像素单位)。这个公式揭示了几个关键特性:
- 反比关系:视差越大,深度越小(物体越近);视差越小,深度越大(物体越远)。
- 非线性:深度分辨率随距离增加而急剧下降。近距离处,视差变化 1 像素对应的深度变化很小;远距离处,视差变化 1 像素对应的深度变化很大。
- 精度公式:深度误差 ΔZ ≈ Z² / (f × b) × Δd。这意味着深度误差与距离的平方成正比,与基线和焦距成反比。
例如,某双目相机 f = 1000 像素,b = 120 mm,视差匹配精度 Δd = 0.5 像素。在 Z = 1 m 处,深度误差约为 4.2 mm;在 Z = 5 m 处,深度误差约为 104 mm;在 Z = 10 m 处,深度误差约为 417 mm。这说明立体视觉在近距离具有高精度,远距离精度急剧下降,设计系统时需要根据工作距离选择合适的基线和分辨率。
2.4 相机标定与校正:从理论到工程落地
相机标定是获取相机内参(焦距、主点、畸变系数)和外参(旋转矩阵、平移向量)的过程。常用方法为张正友标定法,使用棋盘格或圆点标定板拍摄 10~20 张不同姿态的图像,通过角点检测和最小二乘优化求解参数。标定结果的质量直接影响立体校正和深度计算的准确性。
立体校正的典型流程如下:
- 单目标定:分别标定左右相机的内参和畸变系数。
- 双目标定:计算左右相机之间的旋转矩阵 R 和平移向量 T。
- 立体校正:使用 Bouguet 算法或 Hartley 算法,将左右图像重投影为极线水平对齐的图像。
- 校正验证:在左右校正图像上选取对应点,检查 y 坐标差是否小于阈值(通常 0.5 像素)。
# 典型标定流程(OpenCV 伪代码)
# 1. 单目标定
retL, mtxL, distL, rvecsL, tvecsL = cv2.calibrateCamera(objpoints, imgpointsL, grayL.shape[::-1], None, None)
retR, mtxR, distR, rvecsR, tvecsR = cv2.calibrateCamera(objpoints, imgpointsR, grayR.shape[::-1], None, None)
# 2. 双目标定
retS, mtxL, distL, mtxR, distR, R, T, E, F = cv2.stereoCalibrate(
objpoints, imgpointsL, imgpointsR, mtxL, distL, mtxR, distR, grayL.shape[::-1])
# 3. 立体校正
R1, R2, P1, P2, Q, roi1, roi2 = cv2.stereoRectify(
mtxL, distL, mtxR, distR, grayL.shape[::-1], R, T, alpha=0)
# 4. 校正映射
map1L, map2L = cv2.initUndistortRectifyMap(mtxL, distL, R1, P1, grayL.shape[::-1], cv2.CV_32FC1)
map1R, map2R = cv2.initUndistortRectifyMap(mtxR, distR, R2, P2, grayR.shape[::-1], cv2.CV_32FC1)
# 5. 应用映射
rectifiedL = cv2.remap(imgL, map1L, map2L, cv2.INTER_LINEAR)
rectifiedR = cv2.remap(imgR, map1R, map2R, cv2.INTER_LINEAR)
标定与校正环节的常见问题包括:标定板图像数量不足导致参数过拟合、标定板未覆盖视场边缘导致畸变校正不彻底、双目基线在运输或使用中发生微小形变导致极线偏移。因此,在量产或长期部署场景中,建议定期重新标定,并在系统中加入校正质量监控模块。
2.5 案例拆解:双目相机选型与标定实战
某仓储机器人项目需要检测 0.5~3 m 范围内的货架与障碍物,要求深度精度在 1 m 处优于 10 mm,在 3 m 处优于 100 mm。初始方案选用基线 60 mm、分辨率 1280×720、焦距 800 像素的相机模组。经计算,在 3 m 处视差约为 16 像素,若匹配精度为 0.5 像素,深度误差约为 281 mm,远超 100 mm 的需求。
分析后决定将基线增大到 120 mm,同时将分辨率提升至 1920×1080,焦距相应变为 1200 像素。重新计算:3 m 处视差约为 48 像素,深度误差约为 94 mm,满足要求。但基线增大导致 0.5 m 处盲区扩大,两个相机无法同时看到 0.5 m 内的物体。最终方案采用“双目 + 单目”融合策略:近距离(0.3~0.8 m)使用单目视觉或 ToF 传感器,远距离(0.8~3 m)使用双目立体视觉。
标定过程中,团队拍摄了 25 张不同姿态的标定板图像,重投影误差控制在 0.08 像素以内。立体校正后,随机选取 50 对特征点验证极线水平度,平均 y 坐标差为 0.3 像素,最大偏差 0.6 像素。实际运行中,深度图在 1 m 处误差约 8 mm,3 m 处误差约 85 mm,满足系统需求。
复盘经验:第一,深度精度需求必须从系统层面分解,不能只看标称参数;第二,基线、分辨率、焦距三者需要联合优化,不能孤立调整;第三,标定质量验证不能只看重投影误差,必须结合校正后的极线水平度进行端到端验证;第四,在复杂光照和纹理稀疏场景中,需要配合主动纹理投影或结构光方案来提升匹配鲁棒性。