JA EN ZH

立体视觉与距离测量 - 从视差恢复 3D 信息

· 9 分钟阅读

立体视觉原理 - 模拟人类双目视觉

立体视觉通过两个不同位置的相机 (类似人的双眼) 拍摄同一场景,利用视差 (同一点在两张图像中的位置差异) 计算深度。视差越大,物体越近。

基本原理: 对于基线距离为 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 / f
Y = (v - cy) × Z / f
Z = 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: 深度感知用于遮挡处理和手势识别

Related Articles

相机标定基础 - 内参与畸变校正实用指南

学习相机标定的基本原理,包括针孔相机模型、镜头畸变模型和 Zhang 标定法的实践步骤。

单目深度估计技术与应用 - 从单张图像推断深度

从 MiDaS 和 DPT 模型到自动驾驶和 AR 应用的深度图生成系统指南。涵盖原理到实际实现。

点云基础与 3D 重建 - 从采集到处理

全面介绍点云数据的基础知识,涵盖 LiDAR 和深度相机采集、预处理、配准、网格重建及实用工具链。

特征点匹配基础 - SIFT、ORB 和 AKAZE 的原理与实现

系统讲解图像特征点匹配技术。涵盖 SIFT、ORB、AKAZE 的原理,以及 BFMatcher、FLANN 匹配和 RANSAC 几何验证。

工业检测中的图像处理 - 从外观检查到尺寸测量

系统讲解图像处理在工业检测中的应用。涵盖缺陷检测、尺寸测量、表面检查和深度学习方法。

图像去模糊原理与实践 - 从运动模糊到散焦恢复

系统讲解图像去模糊技术,涵盖维纳滤波、盲反卷积以及最新深度学习方法的实现细节。

Related Terms