3、3D视觉传感器:深度相机(双目、ToF、结构光)原理、选型要点、点云数据基础

做3D视觉这些年,我接触最多的就是深度相机。说白了,它就是给普通相机加上“测距”能力,让每个像素不光有颜色,还有深度值。这一章咱们就聊聊三种主流深度相机的原理、怎么选型,以及点云数据的基本操作。

核心观点:没有完美的深度相机,只有最适合你项目的方案。选型时别只看参数表,一定要结合现场光照、物体材质和运动速度来定。

3.1 三种主流深度相机原理

3.1.1 双目立体视觉

双目相机模仿人眼,用两个镜头拍同一场景,通过视差计算深度。我记得刚入行时,总觉得双目原理简单,不就是三角测量嘛。直到自己搭了一套双目系统,才发现坑多得很。

核心公式:

深度 Z = (基线长度 B × 焦距 f) / 视差 d

视差d是左右图像中对应点的像素偏移。基线越长,深度精度越高,但相机体积也越大。

我的经验:双目相机对纹理非常敏感。纯白墙面、光滑金属表面,基本算不出深度。我在做AGV避障时,遇到大面积白墙,深度图全是黑洞。后来加了个结构光投影器才解决。

双目优势:

  • 硬件成本低,只需要两个CMOS传感器
  • 室内室外都能用,不受环境光影响
  • 功耗相对较低

双目劣势:

  • 计算量大,需要GPU或FPGA加速
  • 弱纹理区域失效
  • 基线限制了最小工作距离

3.1.2 ToF(飞行时间法)

ToF相机直接测量光脉冲往返时间。原理很简单:发射光→反射回来→计算时间差→得到深度。

我最早接触ToF是用的Kinect v2,那时候觉得这玩意儿真神奇,30fps直接出深度图,比双目快多了。但后来发现,它在强光下表现很差,室外基本没法用。

ToF分类:

  • 直接ToF(dToF):测量单个光子飞行时间,精度高,但成本也高。苹果LiDAR就是dToF。
  • 间接ToF(iToF):测量发射波和接收波的相位差,成本低,但多路径干扰严重。
避坑指南:我曾经在一个项目里用iToF做近距离人体检测,结果金属桌腿产生了严重的多路径反射,深度值跳来跳去。后来换成dToF才稳定。如果你做高精度测量,尽量选dToF。

3.1.3 结构光

结构光投影已知图案到物体表面,通过图案变形计算深度。Kinect v1就是典型代表。

原理流程:

  1. 投影器发射编码光斑(散斑或条纹)
  2. 相机拍摄变形后的图案
  3. 算法匹配投影图案和拍摄图案
  4. 三角测量计算深度

结构光的优势是精度高,近距离(0.1-1米)能达到亚毫米级。我做人脸识别项目时,用的就是结构光方案,眉毛、鼻梁的细节都能重建出来。

但结构光怕强光。室外阳光下,投影图案根本看不清。另外,投影器和相机之间的基线也限制了工作距离。

3.2 三种方案对比

特性 双目 ToF 结构光
测距原理 三角测量 飞行时间 三角测量
精度 中等(随距离下降) 中等(厘米级) 高(亚毫米级)
帧率 低(需计算) 高(30-60fps) 中等(10-30fps)
抗环境光 强 弱 弱
弱纹理 差 好 好
功耗 低 中 中
成本 低 中 中高
典型距离 0.5-20m 0.3-5m 0.1-3m

3.3 选型要点

选型这事儿,我踩过不少坑。给你几个实用建议:

  • 看工作距离:近距离(<1m)选结构光,中距离(1-5m)选ToF,远距离(>5m)选双目。
  • 看环境光照:室外强光下,双目是唯一选择。室内弱光,ToF和结构光都行。
  • 看物体材质:透明物体、反光物体,三种方案都头疼。我做过一个项目,要测玻璃瓶的位置,最后只能用双目加偏振片。
  • 看帧率要求:机器人抓取需要高帧率,ToF最合适。静态场景重建,结构光精度更高。
  • 看成本预算:消费级产品用双目或结构光,工业级用高精度ToF或定制双目。
选型口诀:近距高精结构光,中距动态选ToF,远距室外用双目,特殊材质多测试。

3.4 点云数据基础

深度相机输出的原始数据是深度图,但咱们做3D视觉,最终要的是点云。点云就是一堆三维坐标点,每个点包含(x,y,z)信息,有的还带RGB颜色。

3.4.1 深度图转点云

这个转换公式很简单,但容易出错:

// 假设相机内参 fx, fy, cx, cy
// 深度图 depth[u][v] 单位毫米
// 转点云:
x = (u - cx) * depth[u][v] / fx
y = (v - cy) * depth[u][v] / fy
z = depth[u][v]

注意单位统一。我见过有人把毫米和米混用,点云直接飞到天上去。

3.4.2 点云数据结构

常用的点云格式:

  • PCD:Point Cloud Library的标准格式,支持XYZ、RGB、法向量等字段
  • PLY:多边形文件格式,常用于3D模型
  • XYZ:纯文本格式,每行三个坐标值
  • LAS:激光雷达标准格式,工业常用

我个人习惯用PCD,因为PCL库支持好,读写方便。但如果你要和CAD软件交互,PLY更通用。

3.4.3 点云基本处理

拿到点云后,第一件事通常是预处理:

  1. 体素滤波:降采样,减少点数。我用VoxelGrid,体素大小设1-5mm,能去掉90%的冗余点。
  2. 统计滤波:去除离群点。每个点算邻域距离均值,超过3倍标准差的干掉。
  3. 直通滤波:按坐标范围裁剪。比如只保留z=0.5-2m的点,去掉背景。
  4. 法向量估计:为每个点计算法向量,用于后续分割和配准。
小技巧:体素滤波的体素大小很关键。设太大,细节丢失;设太小,计算慢。我一般先试2mm,看效果再调。另外,滤波顺序也很重要——先降采样再滤波,能省不少时间。

3.5 知识结构图

下面这张图帮你理清本章的知识脉络:

3D视觉传感器知识结构图 3D视觉传感器知识体系 深度相机 三种原理 双目立体视觉 ToF 结构光 选型要点 工作距离 环境光照 物体材质 点云数据基础 深度图转点云 数据格式 预处理 核心逻辑:原理决定选型方向,选型影响点云质量,点云处理决定最终效果 三者环环相扣,缺一不可 机器人手眼标定实战 本章是后续标定、定位、抓取的基础 理解传感器原理,才能用好标定算法

3.6 实战建议

最后给你几个实战建议:

  • 别迷信参数:标称精度和实际精度是两码事。我测过某款ToF相机,标称1cm精度,实际在强光下误差超过5cm。
  • 先做标定:深度相机出厂参数不一定准。我习惯用棋盘格做内参标定,再用平面板做深度校准。
  • 点云可视化:开发阶段一定要实时看点云。我用PCL的CloudViewer,能看到很多算法发现不了的问题。
  • 数据记录:现场测试时,把原始深度图和点云都存下来。回去慢慢分析,比现场调试效率高得多。
重要提醒:深度相机不是万能的。透明物体、镜面反射、吸光材料(如黑色橡胶),这三种材质是所有深度相机的噩梦。遇到这些情况,考虑用激光雷达或接触式传感器做补充。