2、双目视觉基础:相机成像模型、针孔模型、内参外参、畸变与校正

双目立体匹配算法的输入是两张存在视差的图像,而这两张图像的质量与几何关系直接决定了匹配的精度上限。如果对相机成像的物理过程、像素坐标与世界坐标的映射关系、镜头畸变的来源缺乏系统理解,后续的极线校正、代价计算、视差优化都将建立在不可靠的基础上。本章从针孔模型出发,逐步推导相机内参、外参的数学含义,并深入讲解畸变产生机理与校正流程,为后续立体匹配建立严格的几何前提。

双目相机几何链路与畸变校正流程 世界坐标系 (Xw, Yw, Zw) R, t 相机坐标系 (Xc, Yc, Zc) 针孔投影 归一化平面 (x', y', 1) 畸变 畸变坐标 (xd, yd) 内参K 像素 (u, v) 左相机 光心 OL, 焦距 f 主点 (cxL, cyL) 右相机 光心 OR, 焦距 f 主点 (cxR, cyR) 基线 B(双目外参平移向量) 极线约束:同名点必在对应极线上 → 立体匹配降维 ① 内参标定 棋盘格/圆点标定板 ② 畸变校正 去畸变 + 像素重映射 ③ 立体校正 Bouguet算法 → 行对齐 ④ 匹配 SGBM等

上图完整展示了从世界坐标到像素坐标的几何链路,以及双目系统中左右相机通过基线建立几何约束、最终通过立体校正将匹配问题从二维搜索降为一维搜索的核心流程。下面逐一拆解每个环节的数学本质与工程实现。

2.1 针孔模型:从三维世界到二维像素的数学映射

核心原理:针孔模型是相机成像的最简近似,它假设光线沿直线传播,穿过光心后在成像平面上形成倒像。为便于数学表达,通常将成像平面虚拟到光心前方,形成正立像。设空间点 P 在相机坐标系下的坐标为 (Xc, Yc, Zc),其投影到归一化平面(焦距 f=1)上的坐标为:

x' = Xc / Zc
y' = Yc / Zc

这一步将三维坐标压缩到二维,但丢失了深度信息 Zc——这正是立体匹配需要恢复的量。随后,归一化坐标通过内参矩阵 K 变换为像素坐标:

[u]   [fx  0  cx] [x']
[v] = [0  fy  cy] [y']
[1]   [0   0   1 ] [1 ]

其中 fx、fy 分别为 x、y 方向的等效焦距(单位:像素),cx、cy 为主点坐标(光轴与成像平面的交点)。fx = f / dx,dx 为单个像素的物理宽度。实际镜头中,像素可能不是正方形,因此 fx 与 fy 存在差异。

参数符号物理含义典型值范围对匹配的影响
fx, fy等效焦距(像素)500~3000决定视差-深度灵敏度
cx, cy主点坐标图像中心附近偏移导致视差系统偏差
k1, k2, k3径向畸变系数-0.5~0.5边缘畸变影响匹配窗口
p1, p2切向畸变系数±0.01量级镜头装配误差导致
工程中,fx 与 fy 的比值通常接近 1,但低成本摄像头或鱼眼镜头可能偏差 5% 以上。若忽略此差异,立体匹配的视差图会出现系统性倾斜误差。

2.2 内参与外参:相机几何的完整描述

核心原理:内参矩阵 K 描述相机坐标系到像素坐标系的变换,只与相机自身结构有关;外参描述世界坐标系到相机坐标系的刚体变换,由旋转矩阵 R(3×3)和平移向量 t(3×1)组成。完整映射为:

Zc * [u, v, 1]^T = K * [R | t] * [Xw, Yw, Zw, 1]^T

对于双目系统,左右相机各有一套内参 (KL, KR) 和各自的外参。两相机之间的相对位姿(即双目外参)为:

R_rel = RR * RL^T
t_rel = tR - RR * RL^T * tL

其中 RL、tL 为左相机相对世界坐标的外参,RR、tR 为右相机的外参。双目外参中的平移向量 t_rel 的模长即为基线距离 B,其方向决定了极线在图像中的走向。

判断方法:内参标定通常采用张正友标定法,拍摄 15~20 张不同姿态的棋盘格图像,通过角点检测与单应性矩阵分解求解内参。判断标定结果是否可靠,可观察重投影误差(平均像素误差)是否小于 0.3 像素,以及 fx 与 fy 的比值是否在合理范围。

标定时棋盘格应覆盖图像四个角落和中心区域,且每张图的棋盘格倾角应有明显差异(如 0°、15°、30°、45°),否则求解的畸变系数会退化。

2.3 畸变模型:镜头非理想性的数学补偿

核心原理:实际镜头存在径向畸变(桶形或枕形)和切向畸变(镜头与传感器不平行)。径向畸变用多项式模型描述:

x_dist = x' * (1 + k1*r^2 + k2*r^4 + k3*r^6)
y_dist = y' * (1 + k1*r^2 + k2*r^4 + k3*r^6)

其中 r^2 = x'^2 + y'^2。切向畸变模型为:

x_dist = x' + [2*p1*x'*y' + p2*(r^2 + 2*x'^2)]
y_dist = y' + [p1*(r^2 + 2*y'^2) + 2*p2*x'*y']

畸变校正的目标是:给定畸变坐标 (xd, yd),反求理想坐标 (x', y')。由于畸变模型是多项式,反求通常采用迭代法(如牛顿法)或查表法。OpenCV 的 cv::undistort 函数内部使用迭代优化求解。

操作流程:

  1. 标定得到畸变系数 k1, k2, p1, p2, k3(k3 通常仅对鱼眼镜头需要);
  2. 生成校正映射表 map_x, map_y(每个像素的源坐标);
  3. 使用双线性插值或三次插值重采样生成校正图像;
  4. 对左右图像分别执行上述操作,确保校正后图像尺寸与原始一致。
畸变校正必须在立体校正之前完成。若先做立体校正再做畸变校正,极线约束会被破坏,导致匹配搜索范围重新变为二维。

2.4 立体校正:将双目几何转化为标准形式

核心原理:立体校正(Stereo Rectification)的目标是重投影左右图像,使得两幅图像的极线水平对齐,即同名点位于同一行。Bouguet 算法是 OpenCV 中 cv::stereoRectify 的默认实现,其核心思想是将右相机相对左相机的旋转矩阵 R_rel 分解为左右各旋转一半(R_left = R_rel^(1/2),R_right = R_rel^(-1/2)),再通过构造旋转矩阵使光轴平行于基线方向。

校正后,左右图像的投影矩阵变为:

P_left  = [fx  0  cxL  0]
          [0  fy  cyL  0]
          [0   0   1   0]

P_right = [fx  0  cxR  -fx*B]
          [0  fy  cyR   0]
          [0   0   1    0]

其中 B 为基线长度,cxR 与 cxL 的差值称为视差偏移。此时,深度 Z 与视差 d 的关系简化为:

Z = (fx * B) / d

这一线性关系是立体匹配算法中最核心的几何公式。

校正步骤输入输出关键参数
内参标定棋盘格图像序列K, distCoeffs重投影误差 < 0.3px
双目外参标定左右棋盘格图像对R_rel, t_rel基线 B 的精度
立体校正K, dist, R_rel, t_relR1, R2, P1, P2, Q校正后行对齐误差 < 1px
重映射map_x, map_y校正后图像对插值方法选择

2.5 实战案例:双目相机标定与校正的完整闭环

场景背景:某机器人项目采用双目相机(型号:Stereolabs ZED 2 的替代方案,使用两颗 OV9281 全局快门传感器,分辨率 1280×720,基线 60mm),用于室内 SLAM 与障碍物测距。初始使用厂家默认参数,发现近距离(1~2m)测距误差达 8%,且视差图在图像边缘出现明显断裂。

初始现象与目标:边缘区域匹配错误率高,视差图噪声大。目标是将 1~5m 范围内测距误差控制在 2% 以内。

关键输入数据:使用 12×9 棋盘格(方格边长 25mm),拍摄 25 对图像,覆盖不同距离(0.5m~3m)和角度。标定结果:左相机 fx=612.3, fy=611.8, cx=642.1, cy=361.5;右相机 fx=613.0, fy=612.5, cx=639.8, cy=362.2;畸变系数 k1=-0.284, k2=0.087, p1=-0.0012, p2=0.0008。重投影误差 0.21 像素。

分析判断过程:对比左右相机内参,发现 cx 相差 2.3 像素,这会导致视差系统偏移。进一步检查校正后的行对齐误差:在图像中心区域约 0.5 像素,但在边缘(x>1100)达到 2.1 像素,说明畸变校正不彻底或标定板未覆盖边缘区域。

实际操作步骤:

  1. 重新采集标定图像,确保棋盘格出现在图像四角(每张图至少覆盖 3 个角);
  2. 使用 OpenCV 的 cv::calibrateCamera 重新标定,加入 CALIB_ZERO_TANGENT_DIST 标志验证切向畸变是否显著;
  3. 执行 cv::stereoCalibrate 获取双目外参,基线计算值为 59.8mm(与标称 60mm 偏差 0.3%);
  4. 调用 cv::stereoRectify 并设置 ALPHA=0 使校正后图像裁剪最少;
  5. 使用 cv::initUndistortRectifyMap 生成映射表,采用双线性插值重映射;
  6. 验证校正结果:在左右图像中手动选取 10 对同名点,计算行坐标差,最大偏差 0.8 像素。

结果对比:校正后,SGBM 算法生成的视差图边缘断裂减少 70%,1m 处测距误差从 8% 降至 1.5%,3m 处误差从 12% 降至 2.8%。代价是校正后图像有效区域减少约 8%(边缘被裁剪),但可通过调整 ALPHA 参数平衡。

风险与代价:标定过程耗时约 40 分钟,且对环境光照敏感。若标定板反光或光照不均,角点检测精度下降,需开启 cv::CALIB_CB_ADAPTIVE_THRESH 标志。此外,基线标定误差 0.3% 会直接转化为深度误差,因此对基线精度要求高的场景应使用高精度加工夹具固定相机。

复盘经验:标定质量的核心指标不是重投影误差,而是校正后的行对齐误差。建议在标定后增加一个“验证图像对”环节——拍摄一张包含丰富纹理的平面场景,手动检查极线对齐情况,这比单纯依赖数值指标更可靠。

2.6 常见误区与总结复盘

误区一:忽略主点偏移。许多开发者直接使用图像中心作为主点,导致视差图出现系统性倾斜。正确做法是标定获取 cx, cy,并检查其与图像中心的偏差是否超过 5 像素。

误区二:畸变校正与立体校正顺序颠倒。必须先做畸变校正再做立体校正,否则极线约束失效。若使用 OpenCV 的 cv::stereoRectify 时传入原始内参和畸变系数,函数内部会先校正畸变再计算校正映射,但此时映射表生成逻辑更复杂,容易出错。

误区三:忽略左右相机内参差异。左右相机焦距差超过 1% 时,校正后图像的缩放不一致,导致匹配窗口内容不匹配。应在标定后检查 fxL 与 fxR 的差异,若超过 0.5% 需考虑更换镜头或使用更精密的装配。

误区四:过度依赖默认参数。OpenCV 的 stereoRectify 默认 ALPHA=-1(自动裁剪),可能导致校正后图像有效区域过小。应根据实际应用调整 ALPHA 值,在保留有效区域与裁剪边缘畸变之间取得平衡。

总结:相机几何模型是立体匹配的基石。内参决定像素坐标与世界坐标的映射精度,外参决定双目系统的几何约束,畸变校正与立体校正则是将物理相机转化为理想双目系统的必要预处理。工程实践中,标定质量直接决定匹配算法的上限——即使算法再先进,若几何标定误差超过 1 像素,亚像素级视差估计也无从谈起。建议在项目启动阶段投入充足时间完成标定与验证,并建立标定质量评估流程(行对齐误差、基线精度、重投影误差三重指标),为后续算法开发奠定可靠基础。