一句话定义
双目相机对同一物体成像的位置差(视差 d)与深度成反比:Z = f·B/d,其中 f 为焦距、B 为基线;立体匹配的任务就是在校正后的图像对中逐像素求出 d。
为什么重要
视差是被动视觉中最便宜、最可靠的稠密深度来源:不依赖激光、不用学习模型也能出毫米级相对深度;自动驾驶冗余感知、机器人避障、三维扫描都以立体视觉为基本功,深度学习深度估计网络也用它做监督信号。
直观类比
伸直手臂竖起拇指,交替闭左右眼,拇指相对背景左右跳动——跳得越多(视差大)说明拇指越近;双眼间距(基线)越长、看得越专注(焦距越长),同样的跳动能分辨的距离也越远。大脑做的「对齐两眼画面」就是立体匹配。
前置知识
kp-012(极线约束);kp-011(内参与去畸变)。
核心概念
- 视差(Disparity):同一空间点在校正后左右图像中横坐标之差 d = x_l − x_r。
- 立体校正(Rectification):旋转变换使极线水平共线,匹配搜索降到同一行。
- 代价计算:以 SAD/SSD/NCC/Census 比较左右窗口相似度。
- 代价聚合与优化:局部方法沿窗口聚合;SGBM(半全局匹配)沿多条一维路径做动态规划式聚合。
- 深度分辨率:远处视差趋零,精度随距离快速衰减。
- 遮挡/无纹理区域:左图可见右图被挡、或窗口内纹理一致,视差无法确定,输出空洞。
原理与机制
校正后对每个左图像素在右图同行沿一维搜索最相似位置,相似度峰值处的位移即视差;视差图经滤波(左右一致性检查、加权最小二乘精化)后由三角关系换算深度。SGBM 在多个方向上累积一维平滑代价,兼顾速度与全局性,是 OpenCV 默认工业方案。深度不确定性由微分给出:δZ = Z²·δd/(fB),深度误差随 Z 平方增长——基线翻倍可使同样视差精度下的可测距离翻倍,但近处大视差又造成强遮挡,基线是精度与近场完整性的权衡。
公式与模型
Z = f · B / d (f 焦距像素,B 基线,d 视差像素)
深度不确定度: δZ ≈ Z² · δd / (f · B)图示
实例与案例
工业对位:双目模组基线 100 mm、分辨率 1280、f≈1000 像素时,2 m 内毫米级精度,用于流水线上下料定位。自动驾驶冗余:立体视差在雨雾中对激光雷达失效时提供被动冗余。深度学习补充:MC-CNN 系列把「代价计算」换成学习特征,在无纹理与重复纹理区域显著优于手工代价,但推理开销与泛化域偏移是其工程代价。
import cv2
stereo = cv2.StereoSGBM_create(minDisparity=0, numDisparities=128, blockSize=7,
uniquenessRatio=10, speckleWindowSize=100)
disparity = stereo.compute(gray_L, gray_R).astype('float32') / 16.0
depth = fx * baseline / (disparity + 1e-6)常见误区
- 视差越大越近的边界条件:公式在 d→0 处深度爆炸,远处像素的视差量化误差被放大,输出深度图远端噪声大是物理属性而非 bug。
- 跳过校正直接逐块搜索:极线不水平时二维搜索慢且易错配,校正(kp-012)是必须步骤。
- 左右一致性检查可有可无:遮挡区左右视差必然矛盾,不做检查的深度图会有大片假深度。
- 基线越大越好:近场遮挡加剧、匹配难度上升;近距离抓取常用小基线模组。
与其他知识点的关系
极线(kp-012)是本站的一维搜索前提;去畸变(kp-011)保证校正精度;输出的稀疏/稠密深度可直接喂给 kp-014 的重建与 SLAM 作为深度先验。
自测题
- 基线 160 mm、焦距 800 像素,视差 4 像素对应深度多少?
答案要点:Z = fB/d = 800 × 0.16 / 4 = 32 m。
- 为什么远处深度误差增长快?
答案要点:δZ ≈ Z²δd/(fB),深度误差与 Z² 成正比;同一视差量化误差在远处被平方放大。
- 白墙区域视差图为何出现空洞?
答案要点:窗口内亮度一致,相似度无唯一峰值(无纹理);遮挡区则在另一视图无对应像素,均需标记无效。
延伸阅读
- Hirschmüller 2008《Stereo Processing by Semiglobal Matching and Mutual Information》
- kp-014 看稀疏匹配与稠密深度如何进入完整重建