2、深度传感器原理(上):双目立体视觉原理、视差与深度计算、相机标定基础

各位同学,欢迎来到深度传感器的第一讲。今天咱们聊聊双目立体视觉。说实话,在这么多深度获取方案里,双目是我个人觉得最「优雅」的一种——它不需要主动发光,靠纯视觉就能算出深度,像极了人眼的工作方式。

2.1 双目立体视觉:为什么两只眼睛能看出深度?

先问个问题:你闭上一只眼,伸手去拿桌上的水杯,是不是容易抓偏?

这就是双目视觉的核心优势——视差。两只眼睛从不同角度观察同一个物体,看到的图像位置会有偏移。大脑就是靠这个偏移量,反推出物体离我们有多远。

在机器视觉里,我们模拟这个过程。用两个相机,左右放置,同时拍摄。然后找到左右图像中对应的同一个点,计算它在两幅图像中的像素坐标差——这个差值就是视差

核心公式:

深度 Z = (f × B) / d

其中:

  • f:相机焦距(像素单位)
  • B:基线长度(两个相机光心之间的距离)
  • d:视差(左图像素坐标 - 右图像素坐标)

这个公式看着简单,但里面有个坑——视差 d 是整数像素。你想想看,如果物体在10米外,视差可能只有几个像素。一个像素的误差,深度就差出去好几米。所以后来才有了亚像素匹配、立体匹配优化这些技术。

2.2 视差与深度计算:从像素到三维坐标

好,现在咱们把公式拆开揉碎了讲。

假设左图中有一个点 PL = (uL, vL),右图中对应的点是 PR = (uR, vR)。

如果两个相机已经做了极线校正(这个后面会讲),那么 vL = vR,只有 u 方向有差异。视差 d = uL - uR

然后深度 Z 就能算出来了:

Z = (f * B) / d
X = (u_L - c_x) * Z / f
Y = (v_L - c_y) * Z / f

这里 (cx, cy) 是左相机的主点坐标。你看,有了深度 Z,再加上像素坐标,就能反推出三维空间中的 (X, Y, Z) 坐标。这就是从2D到3D的映射

我的经验:实际项目中,基线 B 不是越大越好。基线大了,视差范围大,深度精度高,但左右视图的重叠区域会变小,远处的物体可能只出现在一个相机里。我一般建议基线取在 5cm~20cm 之间,具体看你的应用场景。

2.3 相机标定基础:为什么必须标定?

说到标定,我得先讲个故事。有一次我在现场搭双目系统,两个相机装好了,拍了张图,直接套公式算深度。结果算出来的点云全是扭曲的,像哈哈镜一样。查了半天,发现是相机内参没标准——焦距差了0.5%,基线量错了2mm。

嗯,从那以后我再也不敢跳过标定了。

相机标定,说白了就是搞清楚两件事:

  1. 内参:相机本身的参数,比如焦距、主点、畸变系数
  2. 外参:两个相机之间的相对位置关系(旋转矩阵 R 和平移向量 T)

常用的标定方法是张正友标定法。你只需要打印一张棋盘格,从不同角度拍个十几张照片,算法就能自动解算出内参和外参。

标定输出:

参数 含义 典型值(举例)
fx, fy 焦距(像素单位) 800, 800
cx, cy 主点坐标 640, 480
k1, k2, p1, p2 畸变系数 -0.1, 0.05, 0.001, 0.0005
R, T 右相机相对于左相机的旋转和平移 单位矩阵, [0.1, 0, 0]

2.4 极线校正:把二维搜索变成一维搜索

标定完之后,我们还要做一步关键操作——极线校正

为什么要做?因为没校正之前,你在左图找一个点,要去右图全图搜索对应的点,计算量巨大。校正之后,左右图的对应点都在同一行上,你只需要沿着水平方向搜索就行了。速度能提升几十倍。

校正的原理其实不复杂:通过旋转两个相机的坐标系,让它们的光轴平行,并且让成像平面共面。这样极线就变成了水平线。

注意:极线校正会引入一定的图像畸变,尤其是图像边缘区域。我建议在校正后裁剪掉边缘10%的区域,避免边缘匹配错误。

2.5 立体匹配:找到左右图的对应点

好了,现在左右图已经校正好了,接下来就是找对应点。这一步叫立体匹配

常用的方法有:

  • 块匹配(BM):以左图一个像素为中心,取一个小窗口,在右图的同一行上滑动,找最相似的窗口。速度快,但精度一般。
  • 半全局匹配(SGM):在BM的基础上,加入了平滑性约束,让视差图更连续。精度高,速度也还行。我个人项目里用得最多的是SGM。
  • 基于深度学习的方法:比如PSMNet、RAFT-Stereo,精度很高,但需要GPU,不适合嵌入式设备。

匹配完成后,我们就得到了一张视差图——每个像素的值就是该点的视差 d。然后套用深度公式,就能生成深度图,再结合内参,就能得到三维点云。

2.6 知识体系总览

下面我用一张图来总结本章的核心逻辑:

双目立体视觉知识体系 左相机图像 右相机图像 相机标定 内参 + 外参 + 畸变系数 极线校正 立体匹配(BM/SGM/深度学习) 视差图 → 深度图 → 点云 核心公式:Z = fB/d 关键:亚像素精度

2.7 避坑指南

最后,分享几个我踩过的坑:

  • 标定板不平整:我曾经用一张贴在纸板上的棋盘格,结果纸板有点弯曲,标出来的内参全是偏的。后来换了玻璃基板的标定板,问题解决。
  • 光照不均匀:双目匹配对光照很敏感。左右图亮度差异大,匹配效果会变差。我一般会在相机前加匀光片,或者在算法里做直方图均衡化。
  • 基线测量误差:基线 B 的误差会直接传递到深度上。我建议用游标卡尺多次测量取平均,或者用标定结果反推基线。

好了,这一章的内容就到这里。双目立体视觉的核心就是「标定 → 校正 → 匹配 → 计算」这条链路。每一步都有细节,但掌握了原理,剩下的就是调参和优化了。


公众号:蓝海资料掘金营,微信deep3321