立体视觉与距离测量 - 从视差恢复 3D 信息
立体视觉原理 - 模拟人类双目视觉
立体视觉通过两个不同位置的相机 (类似人的双眼) 拍摄同一场景,利用视差 (同一点在两张图像中的位置差异) 计算深度。视差越大,物体越近。
基本原理: 对于基线距离为 B、焦距为 f 的双目系统,深度 Z 与视差 d 的关系为: Z = B × f / d。这是三角测量的直接应用。
系统组成:
- 双目相机: 两个平行放置的相机,基线距离 5-30cm
- 标定: 确定相机内参 (焦距、主点) 和外参 (相对位置)
- 校正: 将两张图像变换为行对齐 (简化匹配)
- 匹配: 找到左右图像中对应的像素
- 三角化: 从视差计算 3D 坐标
与单目深度估计的区别: 立体视觉基于几何原理,深度精度可量化; 单目深度估计基于学习的先验,精度依赖训练数据。立体视觉适合需要精确测量的场景。
对极几何与校正
对极几何描述了两个相机视图之间的几何约束关系,是立体匹配的数学基础。
对极约束: 左图中的一个点,其对应点必然在右图的一条线 (对极线) 上。这将 2D 搜索问题简化为 1D 搜索。
基础矩阵 F: 编码两视图间对极几何的 3×3 矩阵。对于对应点 x 和 x': x'^T F x = 0。从 8 对以上匹配点可估计 F。
立体校正 (Rectification):
- 将两张图像变换为对极线水平对齐
- 校正后,对应点在同一行上,匹配只需水平搜索
- OpenCV:
cv2.stereoRectify()计算校正变换 cv2.initUndistortRectifyMap()+cv2.remap()应用变换
相机标定: 使用棋盘格标定板,cv2.stereoCalibrate() 同时标定两个相机的内参和相对位姿。标定精度直接影响深度测量精度。
立体匹配 - 块匹配与 SGM
立体匹配是立体视觉的核心步骤,为每个像素找到左右图像中的对应点并计算视差。
块匹配 (Block Matching):
- 对左图每个像素,在右图同一行搜索最相似的块
- 相似度度量: SAD (绝对差之和)、SSD (平方差之和)、NCC (归一化互相关)
- 速度快但结果噪声大,边缘处不准确
- OpenCV:
cv2.StereoBM_create(numDisparities=64, blockSize=15)
SGM (Semi-Global Matching):
- 在多个方向 (通常 8 或 16 个) 上进行路径优化
- 平衡局部匹配代价和全局平滑性
- 质量远优于块匹配,是实际应用的主力算法
- OpenCV:
cv2.StereoSGBM_create(minDisparity=0, numDisparities=128, blockSize=5)
参数调优:
numDisparities: 最大视差范围,取决于最近物体距离blockSize: 匹配窗口大小。大窗口平滑但丢失细节P1, P2: SGM 平滑惩罚。P2 > P1,P2 控制深度不连续处的惩罚
深度学习立体匹配
深度学习方法在立体匹配精度上大幅超越传统方法,尤其在遮挡和弱纹理区域。
AANet (2020): 使用自适应聚合替代 3D 卷积构建代价体积,速度快且精度高。在 KITTI 上接近实时。
RAFT-Stereo (2021): 将 RAFT 光流架构适配到立体匹配。迭代更新视差估计,在 Middlebury 和 ETH3D 基准上达到最先进水平。
CREStereo (2022): 级联循环网络,从粗到细逐步精修视差。在多个基准上排名第一。
自监督方法: 不需要真值视差图进行训练。利用左右一致性约束和光度损失自监督学习。适合真值难以获取的场景。
实时深度学习立体: HITNet (Google) 在边缘设备上实现实时立体匹配。MobileStereoNet 针对移动设备优化。TensorRT 部署可达 30+ fps。
视差图到 3D 点云的转换
将视差图转换为 3D 坐标,生成可用于测量和可视化的点云。
转换公式:
X = (u - cx) × Z / fY = (v - cy) × Z / fZ = B × f / d
其中 (u,v) 是像素坐标,(cx,cy) 是主点,f 是焦距,B 是基线,d 是视差。
OpenCV 实现:
Q = cv2.stereoRectify(...)[4] # 重投影矩阵points_3d = cv2.reprojectImageTo3D(disparity, Q)
点云滤波:
- 去除无效视差 (d=0 或负值) 对应的点
- 去除距离过远的点 (视差过小,精度低)
- 统计滤波去除离群点
精度分析: 深度精度与视差精度的关系: ΔZ = Z² / (B×f) × Δd。距离越远,同样的视差误差导致的深度误差越大。这是立体视觉的固有限制。
实用立体视觉 - 系统搭建与应用
搭建实用立体视觉系统的硬件选择、标定流程和典型应用。
硬件选择:
- 消费级: Intel RealSense D435/D455 (主动红外 + 立体), ZED 2 (被动立体)
- 工业级: Basler 双目系统, FLIR 同步相机对
- DIY: 两个相同型号的 USB 相机 + 固定支架
标定流程:
- 打印棋盘格标定板 (9×6 或 7×5 内角点)
- 从多个角度拍摄 20-30 对图像
cv2.findChessboardCorners()检测角点cv2.stereoCalibrate()计算标定参数- 重投影误差 < 0.5 像素为良好标定
应用场景:
- 机器人避障: 实时深度图用于路径规划
- 工业测量: 非接触式尺寸测量,精度可达 0.1mm
- 自动驾驶: 前方障碍物距离估计
- AR/VR: 深度感知用于遮挡处理和手势识别