1. 双目视觉概述

大家好,我是你们这门课的老朋友。咱们今天正式开篇,聊聊双目立体视觉到底是什么。

你想想看,人为什么有两只眼睛?不是单纯为了看得更「广」,而是为了看得更「深」。单目相机拍出来的照片是二维的,丢失了深度信息。而双目相机,就是模仿人眼,用两个镜头从不同角度拍摄同一场景,然后通过计算两幅图像之间的差异——也就是视差——来还原出物体的三维位置。

核心一句话:双目立体视觉 = 用两个相机 + 三角测量原理,从 2D 图像中恢复 3D 深度信息。

1.1 什么是双目立体视觉

双目立体视觉,说白了就是给机器装上「立体眼」。它属于计算机视觉中一个非常经典的分支——立体视觉(Stereo Vision)。

我记得刚入行那会儿,带我的老工程师跟我说过一句话:「单目靠猜,双目靠算。」什么意思呢?单目视觉想要知道物体离你多远,得依赖先验知识或者深度学习去「猜」;而双目视觉,只要两个相机之间的位置关系标定好了,就能通过几何关系直接「算」出深度。这个「算」的过程,就是我们这门课的核心。

一个完整的双目系统通常包含这几个环节:

  • 图像采集:左右相机同步拍摄
  • 立体标定:确定两个相机的内外参数和相对位姿
  • 畸变校正:消除镜头带来的图像变形
  • 立体校正:让左右图像的行对齐,方便后续匹配
  • 立体匹配:找到左右图像中的对应点
  • 深度计算:根据视差算出深度

嗯,这里要注意,标定和校正做不好,后面的匹配和深度计算全是白搭。这也是为什么我把「立体标定与畸变校正」作为这门课的重头戏。

1.2 双目相机成像原理

咱们先简单回顾一下单目相机的成像模型——小孔成像。光线从物体出发,穿过镜头中心(光心),在成像平面上形成一个倒立的像。这个模型可以用一个 3x4 的投影矩阵来描述。

那双目相机呢?其实就是两个小孔成像模型拼在一起。两个相机之间有一个固定的平移和旋转关系,这个关系我们称之为「外参」。

我画了一张图,帮你理解这个几何关系:

双目立体成像几何模型 左相机 光心 O₁ 右相机 光心 O₂ 基线距离 B 空间点 P 左成像面 右成像面 P₁ P₂ 视差 d = |P₁ - P₂| 深度 Z 与视差 d 成反比:Z = (f × B) / d 物体越近,视差越大;物体越远,视差越小

从图上你能看到,空间中的同一个点 P,在左右相机成像面上分别落在 P₁ 和 P₂ 位置。这两个位置的水平坐标差,就是视差 d。有了视差 d、焦距 f 和基线距离 B,深度 Z 就能直接算出来。

1.3 视差与深度计算

视差这个概念,是双目视觉的灵魂。咱们来拆解一下深度计算公式:

深度公式: Z = (f × B) / d

其中:

  • Z:物体到相机平面的深度距离(单位:mm)
  • f:相机焦距(单位:pixel 或 mm)
  • B:基线距离,即两个相机光心之间的距离(单位:mm)
  • d:视差,即左右图像中对应点的像素横坐标之差(单位:pixel)

这个公式看起来简单,但实际工程中坑不少。我曾经在一个项目中,基线 B 量错了 2 毫米,结果算出来的深度偏差了将近 5%。后来排查了半天才发现是机械装配的误差。

我的经验:基线 B 和焦距 f 的标定精度,直接决定了深度测量的精度。建议在标定完成后,用已知距离的标定板做一次验证,确认误差在可接受范围内再往下走。

另外,视差 d 是整数像素级别的,但实际对应点往往落在亚像素位置。所以立体匹配算法通常会输出亚像素精度的视差,比如通过抛物线拟合或者二次插值来得到更精确的 d 值。

我把几个关键参数的影响整理成了表格,方便你对照:

参数 增大时的影响 减小时的影响 工程注意事项
基线 B 深度分辨率提高,但视场重叠区减小 深度分辨率降低,但重叠区增大 根据测量距离范围选择,近距用小基线,远距用大基线
焦距 f 视场角变小,远处物体视差变大 视场角变大,近处物体视差变小 长焦适合远距离测量,短焦适合近距离大视野
视差 d 深度 Z 变小(物体更近) 深度 Z 变大(物体更远) 视差搜索范围影响算法速度和精度

1.4 双目视觉的应用场景

聊了这么多原理,咱们看看双目视觉到底能干什么。我这些年接触过的项目,覆盖了下面几个主要方向:

  • 机器人导航与避障:这是最经典的应用。机器人通过双目相机实时获取周围环境的深度图,识别障碍物并规划路径。我在做 AGV(自动导引车)项目时,就用双目视觉实现了 0.5 米到 8 米范围内的障碍物检测。
  • 工业检测与测量:在流水线上,双目系统可以快速测量工件的尺寸、平面度、位置偏差。精度能做到 0.1 毫米级别,前提是标定做得足够好。
  • 自动驾驶与 ADAS:车载双目相机用于前向碰撞预警、车道偏离检测、行人识别。我记得有一次在测试车上调试,算法把路边的垃圾桶误识别成了行人,后来发现是立体匹配在纹理重复区域出了错。
  • 三维重建与 SLAM:用双目相机做同步定位与地图构建,比单目 SLAM 多了一个尺度信息,不会出现尺度漂移的问题。
  • 人机交互与手势识别:通过深度信息分割出手部区域,实现隔空操作。
避坑提醒:双目视觉不是万能的。在弱纹理区域(比如白墙)、重复纹理区域(比如百叶窗)、透明物体(比如玻璃杯)面前,立体匹配很容易失效。我曾经在一个室内场景项目中,因为墙面太光滑,匹配算法几乎全崩了,最后不得不加投影纹理来辅助。