上周有个做机器人抓取Demo的朋友问我,买哪种3D相机合适。预算几千块,要识别乱放的工件,还想在室外用。我反问他:你要的是双目、结构光,还是ToF?他愣了一下,说“不都是3D相机吗”。这个困惑其实特别普遍——市面上叫“3D相机”的设备,背后的3D光学传感原理至少能数出六种,每一种的精度、量程、场景适应性和价格完全不在一个量级,选错了不是调调参就能救回来的。
这篇文章就把主流的六种3D光学传感技术完整梳理一遍:双目立体视觉、结构光、ToF、激光三角测量、条纹投影、光场成像。我会讲清楚每种技术的物理原理、适用场景、关键参数,以及我在实际项目里踩过的坑和验证过的方法。不管你是做机器人、工业检测、逆向建模还是消费级产品选型,希望能帮你少交点学费。
1. 选3D相机前,先把三组关键参数对齐
1.1 深度图、点云和“精度”到底指什么
聊技术之前,先对齐概念。3D相机输出的结果通常有两种形式:一种是深度图(Depth Map),每个像素存一个距离值,看起来是灰度图,越亮代表越近;另一种是点云(Point Cloud),输出一大堆三维坐标点,每个点带XYZ,有些还会带颜色或反射强度。
“精度”这个词在3D视觉里特别容易把人带沟里。它至少有三种含义:绝对精度、相对精度、重复精度。很多厂商最喜欢标重复精度,因为同一位置反复测,读数很稳定,但这不代表测出来准。我见过有人在理想条件下用白板测出0.1毫米的重复精度,一到黑色哑光零件上直接翻好几倍。所以看参数表时,先确认一个细节:这个精度指标是在多远距离、什么材质的物体上测出来的。另外还要分清深度精度和点云精度,深度图上的像素级误差经过三维换算后会被放大,两回事。
1.2 主动光学与被动光学的分水岭
六种技术可以按一个很本质的标准分成两拨:有没有自带光源。
被动光学不发光,靠环境光成像,双目立体视觉就是代表。它好处是功耗低、结构简单、成本便宜,坏处是极度依赖场景纹理和光线条件。主动光学则会主动投射红光、红外激光、条纹光栅之类的信号源,采集设备再去读取被物体形变后的信号。结构光、ToF、激光三角、条纹投影、光场成像里也有一部分属于“半主动”思路(比如光场相机本身不需要投光,但深度估计有时依赖纹理)。
这个分水岭决定了你的应用场景能不能成立。户外强阳光下,红外方案大概率被太阳光淹没;暗光无纹理的仓库里,纯双目又容易瞎。选型的第一步不是比谁参数好看,而是先搞清楚你的环境在哪个阵营。
1.3 精度、量程、速度的“不可能三角”
3D光学传感普遍存在一个三角约束:精度、量程、速度,最多只能同时满足两项。
ToF速度快、量程大,但精度一般在厘米级;激光三角测量精度能到几十微米级,但通常是逐点或逐线扫描,做不到全场一次成型;条纹投影全场精度很高,但需要连续拍摄多帧,被测对象必须保持静止。理解这个三角,后面看每种技术的取舍就有谱了。所谓选型,本质是选一个符合你应用优先级的平衡点。
2. 双目立体视觉:用视差脑补深度的被动派
2.1 核心原理:把三角测量搬到像素层面
双目立体视觉的原理和人眼一样,靠两个有固定间距(称为基线Baseline)的相机观察同一个场景。场景里某个物点会分别落在左图和右图的不同像素坐标上,这两个像素位置的横向差异,叫视差(Disparity)。
深度和视差成反比关系,公式很简洁:
Z = f * B / d
其中Z是深度,f是焦距(以像素为单位),B是基线长度,d是视差(单位也是像素)。物体越近,视差越大;物体越远,视差越小。这也是为什么双目相机的基线越长,能测的距离就越远、精度越高——基线是放大视差的杠杆。
这句话读起来很轻松,但真正落地时,麻烦全在“d”上。
2.2 最难的不是几何,是找对应点
计算视差的前提是:左右两幅图里,你得知道同一个物点分别在哪。这个叫“对应点匹配”(Stereo Matching),是整个双目方案最大的痛点。
纯白墙面、光滑塑料、天空这类缺少纹理的区域,左右图长得一模一样,匹配算法只能瞎猜,结果就是深度图上一片“黑洞”或者噪声花纹。反过来,有重复纹理的场景也不行,比如铁丝网、百叶窗,算法会匹配错周期,深度出现整段的跳变。
我在一个项目里吃过这个亏:仓库里的货物很多是黑色缠绕膜包裹,表面既有高光又有暗区,双目相机匹配出来的点云边缘全是毛刺。后来我们往场景里补了一盏红外补光灯,配合一个散斑投射器,相当于“给场景人为加上随机纹理”,匹配成功率立刻上来了。这种“双目+散斑投射器”的组合,在行业里被称为主动双目(Active Stereo),算是把双目和后面的结构光思路杂交了一下。
2.3 标定和极线校正决定生死
双目能算准的前提,是两台相机的内参(焦距、主点、畸变)、外参(相对位移和旋转)都标得准。常用的标定手段是棋盘格标定板,拍几十张不同位姿的图片,算出相机参数,再做极线校正(Rectification)。校正之后,左右图的对应点搜索从二维变成一维——只需要在同一行上找匹配点,计算量大幅下降。
这里有个容易被忽略的坑:双目的机械结构必须是刚性的。我用过一款用铝型材和螺丝固定的双目支架,刚装好时标定精度没问题,跑了一周后发现深度值整体漂移了。原因很简单,设备发热和户外温差让支架产生了形变,基线变了,原来的标定就失效了。所以工业现场用双目,要么选一体化的刚性外壳设计,要么把定期重标定写进运维流程。
2.4 场景适配与成本
双目最大的优势是便宜和灵活。两个工业相机加上镜头,几千块钱就能做出一个不错的原型系统,而且被动方案不发光,户外阳光下依然能用。消费级的双目模块在1到3米范围内的深度精度通常在毫米到厘米级别,做避障、跟随、简单定位够用,做精密测量就不太行了。
3. 结构光:先把场景“编码”再解码深度
3.1 从散斑到编码条纹
结构光的思路和双目完全不同:它不依赖场景本身的纹理,而是主动向物体投射一个“已知”的图案,再用相机拍摄被物体表面调制后的图案,通过图案的变形或编码来恢复深度。相机知道投影器发出去的是什么,只要算图案扭曲了多少,就能算出高度差。
结构光分两大流派。一类是散斑结构光,投射器打出一片看似杂乱、实际有确定分布的随机光斑,相机拍摄后再和投影器里的参考散斑图做相关匹配。另一类是编码结构光,投射竖条纹或方格图案,条纹本身带编码信息(格雷码、正弦相位等),每个像素都能知道自己“看的是第几根条纹”。
散斑方案的优点是单帧就能解出深度,速度快,但空间分辨率和精度一般;编码条纹方案精度更高,但通常要连续投影很多帧图案,物体必须保持静止,适合扫描静态物体。
3.2 为什么手机3D面部解锁偏爱结构光
很多人第一次接触3D相机应该都是通过手机的面部解锁。那类方案的典型配置是:一个红外激光投射器,打出上万个散斑点的点阵;一个红外相机拍摄人脸;再加一个泛光照明器。人脸在几十厘米距离上,深度精度能做到毫米级,形变明显、欺骗难度高,而且整个模组体积可以做得非常小。
这类方案在近距离(0.3到1米)表现很好,但有两个天然软肋。第一,红外光对深色物体吸收严重,头发、黑色橡胶这类目标在红外图里接近“隐身”,重建出的点云经常缺一块;第二,人脸或者物体快速移动时,散斑图会产生动态误差,所以这类模组通常要配合算法做运动补偿。
3.3 强光下的结构光“扑街”现场
结构光方案最怕的就是强环境光,尤其是太阳光里的红外成分。户外大白天,投射器的信号直接被环境红外淹没,相机里看到的只有一片泛白,散斑几乎无法分辨。
手段不是没有:在相机前面加窄带滤光片,只允许投射波长附近的光通过;提高投影光源功率;用调制频率区分环境光和信号光。但这些都会增加成本、功耗和发热。所以我给移动机器人项目做技术评审时,凡是明确要在户外强光下使用的,基本优先考虑双目或ToF,纯结构光方案只排在备选。
再补充一个容易被忽略的材料问题:高反光的金属表面会产生镜面反射,结构光的图案会被二次反射打乱,生成一堆虚假点;而表面特别黑的吸光材料,又会因为回光太弱直接丢失数据。遇到这两种情况,都要靠喷涂消光粉或者换测量方案来解决。
4. ToF:用光子的往返时间当尺子
4.1 直接ToF与间接ToF
ToF(Time of Flight)的核心是计时:光源发出一束光,打到物体表面再反射回来,传感器记录光子飞行的往返时间Δt,深度就是:
d = c * Δt / 2
这里c是光速,除以2是因为光走了“去”和“回”两趟。听起来简单,但光速是每秒30万公里,测1米距离只需要约6.7纳秒的飞行时间,普通电子元件根本数不过来,所以才演化出两条技术路线。
直接ToF(dToF)用极窄的激光脉冲,配合单光子雪崩二极管(SPAD)这类灵敏度极高的传感器,直接统计光子的到达时刻。它能够“数光子”,所以抗环境光能力更强,苹果的激光雷达扫描仪其实就是这种思路,当然我这说的是原理路线,不是说某款产品。间接ToF(iToF)则发射连续的正弦波调制光,通过测量发射信号与接收信号之间的相位差来反推飞行时间。iToF方案对芯片和光源的工艺要求相对低一些,所以现在手机里的ToF前置镜头大多是这条路。
间接ToF的相位换算公式是:
φ = 4π f d / c
其中φ是相位差,f是调制频率,d是深度。相位差只能在0到2π之间测量,超出这个范围就会出现“模糊距离”问题,也叫距离混叠。ToF能测的最大非模糊距离是:
d_max = c / (2f)
调制频率100MHz时,最大非模糊距离约1.5米;要测更远,只能降低调制频率,但精度会跟着变差。频率、量程、精度三者的拉扯,是设计间接ToF系统的基本功。
4.2 墙角测距偏远的“多径效应”
ToF最让人头疼的问题不是精度不够,而是多径效应(Multipath)。想象一束光照到墙角,一部分光直接反射回传感器,另一部分光打在A面后弹到B面,再从B面反射回来。光子绕了一小段冤枉路,飞行时间变长,测出来的距离就会系统性偏远。
这个偏差在墙角、凹槽、金属曲面周边特别明显,深度图边缘会糊成一片,而且很难用简单标定消除,因为它是几何和材质共同决定的,每个像素的污染程度都不同。做高精度应用的人常说“ToF是测大概很好,测精确很难”,指的就是这个。
4.3 优点与典型场景
ToF的优势同样明确:没有基线,模组可以做得很小;不需要左右图匹配,深度计算直接由芯片完成,帧率能做上30到60帧;配合窄带滤光片后,户外强光下依然能用。所以它在体感交互、AR/VR、手势识别、扫地机器人沿墙导航、汽车驾舱监测这些“要速度、要体积、不要极高精度”的场景里非常流行。
它的精度通常在厘米级。别被某些宣传里“毫米级”的字眼迷惑,工程上能稳定的精度,和环境、物体材质强相关,黑色衣服、透明水瓶、深色地毯都会让结果明显变差。
4.4 实测中必做的“材质-距离拟合”
我使用ToF模块做项目时有个习惯:拿到样机先不做任何数据美化,直接用白墙、灰纸、黑布、硅胶垫四类目标,分别放在0.3米、0.8米、1.5米、3米四个距离上测试,记录偏差。测完你会发现,偏差曲线既跟距离有关,也跟反射率有关。对多数应用来说,没有捷径,只能按“材质+距离”组合做查表校正,把偏差拟合掉一部分。另外指示灯、窗帘缝里的直射阳光、金属桌面的反光,都是实测中最常出现的噪声源,测试环境越接近真实生产线越好。
5. 激光三角测量:工业级定点测距的经典
5.1 原理:用角度杠杆放大微小位移
激光三角测量的经典结构是:一束激光以固定角度投射到被测物体表面,相机在另一个角度接收散射光。物体表面高度发生变化时,相机里激光光斑的位置就会横向移动。这个位移被镜头成像放大后,由像素做亚像素级定位,再通过标定系数换算成高度变化。
它本质上是用一个“角度杠杆”把微观高度变化放大成可观测的像素位移。激光与相机光轴的夹角越大,同样高度差对应的像素位移越大,分辨率越高;但代价是测量量程变窄、遮挡问题更严重、结构也更难做。在设计系统时,夹角是核心权衡参数,没有“越大越好”一说。
测量关系近似可以写成:
Δh ≈ Δp * K
其中Δp是光斑在传感器上的像素位移,K是标定系数,主要由激光与相机的夹角、镜头焦距、物距共同决定,实际工程中以标定板实测为准。请你务必自己算的时候依赖实测标定,不要只按几何推导的公式去估算,因为透镜畸变和光斑能量分布都会影响结果。
5.2 点激光、线激光与扫描模式
激光三角测量有三种常见形态。点激光是单点测距,结构最简单,速度快,常用于在线测厚、测振动位移。线激光向被测物投射一条激光线,相机一次抓到整条轮廓线,输出的是物体的二维剖面(2D轮廓),比如焊缝的截面形状、管材的外径、型材的轮廓。这个剖面数据通过编码器或运动平台带动连续扫描,就能拼成完整的三维点云。
如果被测物不方便移动,也可以用振镜把激光线扫过整个表面,实现小范围的高速度扫描。选择哪种形态,取决于你是在线检测(物体快速经过、要实时出结果)还是离线扫描(物体静止、可以慢慢扫)。
5.3 材质和反光决定成败的上限
激光三角测量的精度上限很高,近距离配置下几十微米甚至亚微米级别都能做到,但这个上限非常脆弱。高光金属表面会产生镜面反射,激光条纹在曲率突变处会断裂,得到满屏“飞点”;黑色吸光表面回光太弱,轮廓线断断续续;透明玻璃和透明塑料更离谱,激光直接透进去,相机看到的是前后两个面的混合信号。
应对方案有几种:换用蓝紫激光,波长更短、金属吸收率高,能缓解高光问题;调整相机和激光的相对姿态,避开镜面反射角度;给被测物喷显影剂(前提是允许接触工件)。我特别提醒做产线的朋友,显影剂这招要用得极其谨慎,它虽然能把黑色橡胶和高光金属全部“洗白”,但会污染工件表面,很多行业是不接受任何残留的。在方案设计阶段,就要先确认你的工件允不允许涂层预处理。
还有一条安全经验:工业激光测量头的输出功率大多是Class 3B甚至Class 4级别,直射眼睛会造成不可逆损伤。现场最常见的事故是调试人员拿黑纸去挡光看光斑位置,激光瞬间把纸烧穿,非常危险。所有调试操作,请先确认激光处于关闭或低功率状态。
6. 条纹投影与相移法:把相位当高精度标尺
6.1 正弦条纹和相移测相
条纹投影轮廓术(Fringe Projection Profilometry)是结构光里的“精细流派”。它投射的不是二值的黑白条纹,而是一系列亮度呈正弦变化的条纹图案。物体表面的高低起伏会使正弦条纹发生形变,而这个形变信息被编码在条纹的相位里。只要能精确解出每个像素的相位,就能换算出高度。
怎么解相位?最常用的是相移法。投射4张相位依次移动90°的正弦条纹,分别记为I1、I2、I3、I4,那么:
I1 = A + B*cos(φ)I2 = A - B*sin(φ)I3 = A - B*cos(φ)I4 = A + B*sin(φ)
联立求解,相位φ可以用反正切函数直接算出:
φ = atan2(I4 - I2, I1 - I3)
写成代码也就几行:
import numpy as np def phase_from_4step(imgs): # imgs: 依次传入I1,I2,I3,I4四帧灰度图 sin_term = imgs[3] - imgs[1] # 2B * sin(φ) cos_term = imgs[0] - imgs[2] # 2B * cos(φ) return np.arctan2(sin_term, cos_term)这个解出来的相位是被包裹的(Wrapped Phase),数值范围只有-π到π之间,看起来像锯齿,因为反正切函数丢掉了2π的整数倍信息。
6.2 相位展开:从“锯齿”到连续深度
要把锯齿状的包裹相位恢复成连续相位,这个过程叫相位展开(Phase Unwrapping),是条纹投影方案里最考验功力的环节。实际应用里,物体会在边缘、遮挡、反射异常处产生断点和跳变,空间展开算法容易被这些噪声“带偏”,一处错,整行都可能跟着错。
更稳的做法是时间相位展开,典型代表是多频外差法:用几种不同频率的条纹分别测量,利用频率之间的拍频关系确定每个像素的条纹级次N,再把绝对相位恢复出来。它牺牲了采集帧数(测一个场景往往要拍几十张图),但抗噪声能力强,是目前高精度3D扫描仪的主流选择。这也决定了这类方案的硬性条件:被测物体在整个拍摄期间必须纹丝不动。
6.3 蓝光扫描仪为什么“娇贵”但精度高
条纹投影早期使用白光投影,后来行业内普遍改用蓝光。原因有三个:蓝光波长更短,在金属表面的散射更可控;蓝光对环境光中的红光和黄光干扰更敏感地隔绝;配合窄带滤光片后,即使在车间照明下也能稳定采集。
市面上牙模扫描、涡轮叶片检测、精密注塑件测量、手办和文物数字化用的高精度3D设备,大多是这条路子。精度能到微米级,但使用约束也不少:物体要稳定,环境不能有强振动;黑色高光件基本都要喷显影剂;相机和投影仪的相对位姿要用高精度标定流程反复校准。另外,条纹投影在广义上属于结构光家族,也就是第3节说到的“编码结构光”的精细版,这里单独拎出来讲,是因为它在原理、算法和工程实践上都已经自成体系,值得当成一个独立技术门类来对待。
7. 光场相机:记录光线方向的计算成像路线
7.1 微透镜阵列:给光路装一个“方向分拣器”
光场相机的思路在六种技术里最另类。普通相机在传感器上只记录光线的位置和强度,把方向信息全部丢掉了。光场相机则在主镜头和传感器之间加了一层微透镜阵列,每个微透镜负责把进入主镜头的光线按方向拆分,传感器上不同像素记录的是同一场景点、来自不同入射角度的光线。
这等于把普通的二维图像升级成了四维光场数据:每个位置上有哪些方向的光线。因为记录了方向,它能做到普通相机做不到的事——先拍照、后对焦。
7.2 先拍摄后对焦和深度估计
拍完一张光场照片后,通过算法把不同方向的光线重新累加,可以选择性地聚焦到不同深度的平面上:想清晰保留前景,就把后景的光线“故意虚焦”;想换个微视角,也可以合成出几个像素范围内的视角平移——这个能力叫“数字重对焦”。
深度估计同样从光场数据里来:把每个微透镜下的特定方向的光线抽出来,分别拼成一张“子孔径图像”,这些图像相当于从不同微小视角看同一个场景,把它们当成极短基线的多目立体匹配输入,就能算出深度图。优点是不需要额外投射任何光源,纯粹是被动方案,拍一张照片就同时拿到光场和深度信息。
7.3 用分辨率换来的“计算摄影”
光场相机最直接的代价是空间分辨率。传感器总像素数是固定的,分给不同方向后,每张子孔径图像的实际分辨率只剩传感器像素数除以方向数的比例。主镜头光圈越大,能分辨的方向越多,角度分辨率越好,但空间分辨率牺牲越严重。这个此消彼长的关系,是光场相机一直难以同时兼顾画质和3D精度的根本原因。
它在工业3D测量里不算主流,但在科研和特殊场景有独特价值:透明样本的内部结构观测、微小液体流场的三维重构、消费级摄影的“先拍后焦”体验。如果你对体积、成本敏感,又不需要亚毫米级精度,光场相机是个值得关注的方向。
8. 六种技术横向对比与选型决策
8.1 一张表看清差异
| 技术 | 典型量程 | 典型精度 | 输出形态 | 环境敏感点 | 相对成本 |
|---|---|---|---|---|---|
| 双目立体视觉 | 0.1m~数十米 | 毫米~厘米级 | 深度图/点云 | 纹理缺失、光照不足 | 低 |
| 结构光(散斑/编码) | 0.3m~5m | 亚毫米~毫米级 | 深度图/点云 | 强环境光、高反光/黑色材质 | 中 |
| ToF | 0.1m~数十米 | 厘米级 | 深度图/点云 | 多径效应、深色吸光材质 | 中 |
| 激光三角测量 | 毫米级~米级 | 微米~数十微米级 | 点/轮廓/点云 | 镜面反射、透明材质 | 中高 |
| 条纹投影(相移法) | 数毫米~数米 | 微米级 | 点云 | 需静物、需喷粉场景 | 高 |
| 光场成像 | 厘米~米级 | 毫米~厘米级 | 深度图/重对焦图像 | 空间分辨率受限 | 中 |
这张表不是绝对值,具体产品的差异可以很大,但作为选型大方向足够了。看表的要点是:精度越高的方案,对场景静止性和表面质地的要求越苛刻;量程越大的方案,精度越难做到精细。
8.2 按场景对号入座
根据我实际接触过的项目,比较典型的需求和方案匹配大致是这样:
- 手机人脸解锁、刷脸支付门禁:首选短距结构光,0.3到0.8米范围内毫米级精度,模组体积又小。
- 机器人对乱序工件抓取:室内环境优先结构光,识别准确、点云密度高;如果工件表面特别光滑,改成主动双目或加喷粉方案。
- 户外巡检、无人车避障:优先双目或ToF,避免主动光在强太阳光下失效;ToF对高速运动更友好。
- 焊缝跟踪、型材轮廓、在线厚度测量:激光三角测量是标准答案,剖面数据实时性好,抗环境光能力强。
- 牙模、手办、文物、精密零件逆向建模:条纹投影(蓝光)扫描仪,追求微米级细节,前提是配置稳定的三维转台和暗室。
- 手势交互、AR/VR、动态人体重建:ToF的30到60fps全场深度最合适。
- 低成本科研成像和历史存档:光场相机一拍拿住全部信息,后面对焦和估算深度都很灵活。
这些只是起点。真实的项目常常会把两种技术拼起来用,比如“双目+散斑投光”解决室内暗纹理问题,或者“激光三角测量+条纹投影”分别负责在线抽检和离线全检。
8.3 选型前建议先做的三件实事
第一,拿真实零件做测试,而不是只看参数表。把要识别的样件各挑几件,放在实际的光照环境里,用候选设备拍一个下午,看点云完整度、边缘毛刺和重复精度。很多理论上的“高精度”,一遇上反光毛刺就崩了。
第二,统计你的环境光。室内是普通照明还是无影灯?窗外有几个方向进阳光?红外类方案尤其要测试“强光从侧面打来”的情况,有时候一个夕阳角度就能让结构光彻底失效。
第三,评估表面的三大“材质杀手”:黑色、透明、高光。这三样几乎能干掉所有光学方案。测试之前先想清楚:能不能喷涂显影剂?能不能调整光照角度?如果不能,就不要硬着头皮选光学测量,考虑接触式方案也许是更稳的选择。
另外集成工程上还有一句碎碎念:很多项目最终延期,不是因为原理选错,而是因为坐标系统一、单位换算、ROI裁剪、点云滤波参数这些“脏活累活”没提前规划。深度精度和点云精度不是一个概念,传感器坐标系到机器人坐标系的标定又是一轮工作量,这些都要在预算里留足时间。
最后说一点我个人体会比较深的东西。我做过的几个落地项目里,真正区分成败的,往往不是选了“哪一种原理”,而是有没有认真处理标定、环境光和材质这三个问题。同一台结构光相机,有些人能调出漂亮的点云,有些人只能得到满屏噪声,差别就在这里。另一个经验是:方案定型前,用自己能接受的成本买一台样机,拿真实工件实测一个下午。很多宣传里漂亮的数字都会在真实测试中现出原形。希望这篇概述能帮你在选型的路上少交一点学费。