立体视觉与深度

核心03-相机与三维几何预计 25 分钟立体匹配视差深度估计SGBM

前置知识点

kp-012 对极几何:本质矩阵与基本矩阵 kp-011 相机标定与畸变

一句话定义

双目相机对同一物体成像的位置差(视差 d)与深度成反比:Z = f·B/d,其中 f 为焦距、B 为基线;立体匹配的任务就是在校正后的图像对中逐像素求出 d。

为什么重要

视差是被动视觉中最便宜、最可靠的稠密深度来源:不依赖激光、不用学习模型也能出毫米级相对深度;自动驾驶冗余感知、机器人避障、三维扫描都以立体视觉为基本功,深度学习深度估计网络也用它做监督信号。

直观类比

伸直手臂竖起拇指,交替闭左右眼,拇指相对背景左右跳动——跳得越多(视差大)说明拇指越近;双眼间距(基线)越长、看得越专注(焦距越长),同样的跳动能分辨的距离也越远。大脑做的「对齐两眼画面」就是立体匹配。

前置知识

kp-012(极线约束);kp-011(内参与去畸变)。

核心概念

原理与机制

校正后对每个左图像素在右图同行沿一维搜索最相似位置,相似度峰值处的位移即视差;视差图经滤波(左右一致性检查、加权最小二乘精化)后由三角关系换算深度。SGBM 在多个方向上累积一维平滑代价,兼顾速度与全局性,是 OpenCV 默认工业方案。深度不确定性由微分给出:δZ = Z²·δd/(fB),深度误差随 Z 平方增长——基线翻倍可使同样视差精度下的可测距离翻倍,但近处大视差又造成强遮挡,基线是精度与近场完整性的权衡。

公式与模型

Z = f · B / d (f 焦距像素,B 基线,d 视差像素) 深度不确定度: δZ ≈ Z² · δd / (f · B)

图示

P 点深度 Z,成像偏移即视差 d 左像 右像(橙块为同一点,横移 d) 基线 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)

常见误区

与其他知识点的关系

极线(kp-012)是本站的一维搜索前提;去畸变(kp-011)保证校正精度;输出的稀疏/稠密深度可直接喂给 kp-014 的重建与 SLAM 作为深度先验。

自测题

  1. 基线 160 mm、焦距 800 像素,视差 4 像素对应深度多少?

答案要点:Z = fB/d = 800 × 0.16 / 4 = 32 m。

  1. 为什么远处深度误差增长快?

答案要点:δZ ≈ Z²δd/(fB),深度误差与 Z² 成正比;同一视差量化误差在远处被平方放大。

  1. 白墙区域视差图为何出现空洞?

答案要点:窗口内亮度一致,相似度无唯一峰值(无纹理);遮挡区则在另一视图无对应像素,均需标记无效。

延伸阅读

相关知识点

kp-014 三维重建与视觉 SLAM 概览kp-019 图像分割:语义、实例与全景