3、3D视觉传感器:深度相机(双目、ToF、结构光)原理、选型要点、点云数据基础
做3D视觉这些年,我接触最多的就是深度相机。说白了,它就是给普通相机加上“测距”能力,让每个像素不光有颜色,还有深度值。这一章咱们就聊聊三种主流深度相机的原理、怎么选型,以及点云数据的基本操作。
3.1 三种主流深度相机原理
3.1.1 双目立体视觉
双目相机模仿人眼,用两个镜头拍同一场景,通过视差计算深度。我记得刚入行时,总觉得双目原理简单,不就是三角测量嘛。直到自己搭了一套双目系统,才发现坑多得很。
核心公式:
深度 Z = (基线长度 B × 焦距 f) / 视差 d
视差d是左右图像中对应点的像素偏移。基线越长,深度精度越高,但相机体积也越大。
双目优势:
- 硬件成本低,只需要两个CMOS传感器
- 室内室外都能用,不受环境光影响
- 功耗相对较低
双目劣势:
- 计算量大,需要GPU或FPGA加速
- 弱纹理区域失效
- 基线限制了最小工作距离
3.1.2 ToF(飞行时间法)
ToF相机直接测量光脉冲往返时间。原理很简单:发射光→反射回来→计算时间差→得到深度。
我最早接触ToF是用的Kinect v2,那时候觉得这玩意儿真神奇,30fps直接出深度图,比双目快多了。但后来发现,它在强光下表现很差,室外基本没法用。
ToF分类:
- 直接ToF(dToF):测量单个光子飞行时间,精度高,但成本也高。苹果LiDAR就是dToF。
- 间接ToF(iToF):测量发射波和接收波的相位差,成本低,但多路径干扰严重。
3.1.3 结构光
结构光投影已知图案到物体表面,通过图案变形计算深度。Kinect v1就是典型代表。
原理流程:
- 投影器发射编码光斑(散斑或条纹)
- 相机拍摄变形后的图案
- 算法匹配投影图案和拍摄图案
- 三角测量计算深度
结构光的优势是精度高,近距离(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或定制双目。
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 点云基本处理
拿到点云后,第一件事通常是预处理:
- 体素滤波:降采样,减少点数。我用VoxelGrid,体素大小设1-5mm,能去掉90%的冗余点。
- 统计滤波:去除离群点。每个点算邻域距离均值,超过3倍标准差的干掉。
- 直通滤波:按坐标范围裁剪。比如只保留z=0.5-2m的点,去掉背景。
- 法向量估计:为每个点计算法向量,用于后续分割和配准。
3.5 知识结构图
下面这张图帮你理清本章的知识脉络:
3.6 实战建议
最后给你几个实战建议:
- 别迷信参数:标称精度和实际精度是两码事。我测过某款ToF相机,标称1cm精度,实际在强光下误差超过5cm。
- 先做标定:深度相机出厂参数不一定准。我习惯用棋盘格做内参标定,再用平面板做深度校准。
- 点云可视化:开发阶段一定要实时看点云。我用PCL的CloudViewer,能看到很多算法发现不了的问题。
- 数据记录:现场测试时,把原始深度图和点云都存下来。回去慢慢分析,比现场调试效率高得多。