1. 从“双眼看世界”到机器感知:为什么需要双目立体视觉?
想象一下,你闭上一只眼睛,然后试着去接住别人抛过来的一个球,是不是感觉难度陡增,很难判断球的准确距离?这就是单目视觉的局限——它能看到物体的样子,却很难精确感知“它离我有多远”。我们人类能轻松判断距离,很大程度上得益于我们拥有两只眼睛。大脑通过比较左右眼看到的图像差异(专业术语叫“视差”),瞬间就能计算出物体的深度信息。双目立体视觉技术,正是让机器模仿人类这一核心能力。
在自动驾驶、机器人导航、工业检测甚至手机的人像模式虚化中,深度信息都至关重要。单目摄像头就像独眼龙,而双目系统则给了机器一双真正的“眼睛”。但给机器装上两只“眼睛”只是第一步,如何让它们像我们的大脑一样,从两幅略有不同的图像中“算”出距离,才是真正的挑战。这个过程,就是从一系列理想化的数学假设,走向充满噪声、误差和工程妥协的现实世界的过程。今天,我就结合自己这些年踩过的坑和实战经验,带你走一遍双目深度估计的完整流程,从最基础的理想模型公式推导,到实际项目中你必须面对的相机标定、立体匹配和极线校正,手把手让你理解这背后的门道。
2. 理想很丰满:标准双目模型的深度公式推导
我们先从最理想、最简单的情况开始。这就像学物理先学无摩擦的真空环境一样,是理解一切复杂问题的基础。
2.1 理想双目系统的三大假设
一个完美的、教科书式的双目系统,必须满足三个苛刻条件:
- 光轴平行:两个相机的光轴(可以理解为镜头正对的方向)必须完全平行。
- 内参一致:两个相机的焦距、像素大小、成像中心等内部参数必须一模一样。
- 仅水平平移:两个相机在空间中的摆放,只能是纯水平方向上的移动,不能有上下、前后的错位,更不能有旋转。
在这种理想情况下,两个相机就像被严格固定在同一个水平轨道上,只有左右间距(这个间距有个专业名词叫“基线”,Baseline,记作 B)。此时,空间中同一个点 P,在左右两个相机成像平面上的投影,只会在水平方向(通常是u坐标轴)上有差异,垂直方向(v坐标)则完全相同。这个水平方向的像素差,就是我们计算深度的黄金钥匙——视差(Disparity,记作 d)。
2.2 一个三角形搞定深度公式
别被公式吓到,我们用一张图和一个简单的三角形相似关系就能讲明白。
假设我们有一个目标点 P,它在左相机图像中的横坐标是 x_l,在右相机中是 x_r。左相机的光心是 O_l,右相机光心是 O_r,两者距离是基线 B。点 P 到相机连线平面的垂直距离就是我们要求的深度 Z。相机的焦距是 f。
根据相似三角形原理,我们可以建立两组关系: 对于左相机:f / Z = x_l / X 对于右相机:f / Z = x_r / (X - B)
这里的 X 是点 P 在左相机坐标系下的真实X坐标(不是像素坐标)。我们把这两个等式联立,消去 X,经过简单的代数变换,就能得到那个最核心的公式:
Z = (f * B) / (x_l - x_r) = (f * B) / d
看,多简洁!深度 Z 与焦距 f、基线 B 成正比,与视差 d 成反比。这意味着:
- 基线 B 越大,测距能力越强(就像你的两眼间距越宽,判断远距离物体越准),但盲区也会变大(太近的物体可能无法同时出现在两个视野中)。
- 视差 d 越大,说明物体越近(左右眼看到的图像位置差别大);视差为0,说明物体在无穷远处。
- 焦距 f 越长,同样的物理距离产生的视差像素数越多,理论上深度计算越敏感,但视野会变窄。
这个公式就是双目深度估计的基石。但现实中,你几乎不可能买到两个完全一致的相机,更别提把它们毫厘不差地平行固定了。
8万+




被折叠的 条评论
为什么被折叠?



