ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

深度相机怎么选?双目、结构光、ToF原理与避坑指南

深度相机怎么选?双目、结构光、ToF原理与避坑指南 我们团队这几年做机器人和视觉方案前前后后选深度相机选了十几款双目、结构光、ToF这三类技术全踩过。先说一个反直觉的事实很多人以为深度相机是把“深度”拍出来的像拍照一样画面里直接带距离信息。实际上消费级和工业级深度相机里几乎没有哪一个是直接“拍”出深度的。双目靠“算”结构光靠“投”ToF靠“测”三种技术路线最终都能给你一帧深度图但背后的光学设计、传感器选型、算法复杂度和标定维护逻辑完全不同也决定了它们的精度曲线、量程、成本和能用多久。这篇文章我想把三者的原理区别一次性讲透包括双目立体视觉的三角测量、结构光的编码光原理、ToF的飞行时间测量以及选型落地时那些网上很少讲的坑。如果你正在纠结项目里该用哪种相机或者刚入行想搞懂这些深度相机到底怎么工作的这篇可以直接照着参考。1. 先原地解锁深度相机输出的“深度”到底是什么1.1 深度图、视差与点云的基本概念深度相机输出的数据通常有几种形态深度图、视差图、点云。深度图就是每个像素保存一个距离数值单位常用毫米比如某个像素是1123mm另一个像素是2345mm。点云则是把相机坐标系下每个有效像素换算成(x, y, z)的三维坐标。我们常说的RGB-D相机就是普通彩色图RGB外加一张深度图D很多消费级深度相机都这么叫。这里有个经常被忽略的点深度误差不是均匀分布的。对绝大多数深度相机来说Z轴方向的误差和XY平面内的误差不是一个量级而且距离越远Z轴误差往往越不可控。这也是为什么很多项目在实验室里测得好好的一到真实场景距离拉远就出问题。做深度相机选型之前最好先搞清楚你的下游任务是吃Z轴精度还是吃XY平面精度这两个是完全不同的概念。1.2 三种方案的本质区别一句话版本先给一个总纲后面再逐条拆解双目用两台相机从不同角度观察同一个场景通过三角测量算出深度。本质是“几何算法”。结构光主动向场景投射有规律的图案相机拍摄图案的变形再利用三角测量或图案匹配算出深度。本质是“主动制造特征 几何算法”。ToF发射光脉冲或调制波测量光从光源到目标再反射回传感器的时间直接用光速和时间算出深度。本质是“物理测距”。这句话的逻辑你可能已经注意到了“几何算法派”的共同点是都在利用同一个结果的微小差异来反推距离“物理测距派”则是直接量时间。这个区别影响深远决定了这些相机在什么样的光照、材质、距离、环境条件下表现如何。2. 双目立体视觉模拟人眼把深度“算”出来2.1 三角测量中学几何解决的问题双目相机的核心原理是三角测量。你可以把两个相机当作两只眼睛它们之间相隔一个固定距离这个距离叫基线。当场景中同一个点P同时出现在左相机和右相机的成像面上时它在左右图像上的位置是不一样的。这个位置差叫视差单位是像素。直觉上很好理解距离越近的物体在左右相机里偏移越大距离越远的物体偏移越小。想象你把手指放在眼前一会儿伸远一会儿拉近背景不动你会清晰地看到两个指尖的“错位”距离一直在变这就是视差。深度的计算公式非常简洁Z (f × b) / d其中Z是深度f是焦距像素单位b是基线长度d是视差像素。只要知道视差深度就出来了。但这里有一个硬伤视差是以像素为最小单位的d每变化1个像素对应的深度变化量不一样。由公式变形可知距离越远1个像素视差对应的深度变化越大而且大致按距离的平方增长。这就是为什么所有双目相机都无法避免“远距离精度急剧下降”。一台基线6cm、分辨率1280×720的双目相机在5米外深度误差经常已经到厘米级甚至十几厘米越远越没法看。2.2 立体匹配双目的真正难点公式简单难的是怎么知道左图的某个像素对应右图的哪个像素。这个对应关系叫立体匹配。我们团队第一次自己做双目时最初以为难点在镜头上后来才发现最难的是匹配算法。为了减少搜索范围双目系统要做极线校正让两台相机的图像行对准。这样左右图上同一个像素点只会在同一水平线上找二维搜索变成一维搜索计算量大幅下降。但即使降成一维匹配仍然非常依赖图像纹理。如果场景是白墙、天空、光滑地面这种完全没有纹理的区域左右图看起来一模一样任何匹配算法都会失效。所以裸双目在无纹理环境下基本“瞎了”。现在主流方法是先在特征匹配的基础上做半全局匹配业界通常叫SGM利用相邻像素的平滑约束来估计稠密视差图。这个算法需要不小的算力通常要在GPU或专用视觉处理芯片上跑MCU直接跑全图分辨率SGM很吃力。很多双目模组里面其实自带了一颗专用处理芯片从外面看很省心但成本都算在模组里。2.3 标定双目的命门双目相机出厂时并非绝对完美镜头有畸变两个传感器也不是绝对平行的所以必须标定。标定通常要做三件事镜头的内参焦距、主点、畸变系数两相机之间的外参旋转R和平移T以及极线校正参数。很多人在项目里最容易踩的坑就是标定数据质量不过关。我接触过不少朋友拿标定板随便拍几张就送去标定出来的参数错得离谱深度图看着还行但实际测量完全对不上。拍标定板有几个经验棋盘格或圆点标定板要尽量平整别用手拿着边缘让板子弯曲。至少拍15到20张不同角度、不同距离的图片让角点在画面各个区域都有分布。每张标定图用重投影误差来判断质量通常误差超过0.1到0.15像素的图片属于“不合格角点”问题要剔除重拍而不是硬塞进标定池。这也是热词里那个“双目相机标定剔除不合格角点”的意思角点检测之后不是提取出来就完事残差过大的角点和图片要主动剔除否则会把整个内参解算带偏。我们团队早期标定时吃过这个亏总想着多一张是一张结果标定完极线校正后图像边缘还是有2到3像素的不齐怎么调都调不好。后来把质量差的图片全部剔除重新标定瞬间干净了。如果是长年使用的设备比如机械臂上的双目相机经历过剧烈震动或镜头碰撞之后最好重新标定。有些厂商提供在线自标定的功能利用场景特征自动修正外参这种“双目自动标定”功能在产线长期使用场景下非常实用。2.4 双目方案的优劣势小结优点很明确不依赖主动光源所以没有光衰问题功耗低传感器是普通CMOS成本可以压得很低近距和中距的精度在纹理丰富的场景下其实非常出色很多工业测量设备用的就是双目结构。缺点也同样明显无纹理区域和暗光环境会失效需要额外补光远距离精度衰减快立体匹配算力需求高标定和维护门槛高。如果你在室内明亮环境里做1到3米的测量双目是性价比之选但如果你要做黑暗里的避障或户外远距离测距裸双目并不合适。3. 结构光给场景“投个影子”从图案变形里算出深度3.1 编码光与三角测量结构光为什么能“无中生有”双目最大的问题是没有纹理就罢工结构光方案的精髓就是你没有纹理我主动投影一些纹理给你。结构光相机由一个投影模组和一个或多个相机组成。投影模组会向场景投射特定的红外图案常见的类型有两类一类是散斑结构光投影的是伪随机的散斑图案像一大片不规则的小点整个场景布满特征点相机拍摄后再与参考图案对比进行匹配另一类是编码结构光投射的是条纹光栅、格雷码、相移正弦条纹等有规律的编码图案通过解码每个像素上的相位或编码信息来直接恢复深度。传统工业3D结构光相机用编码条纹更多消费级产品则大量使用散斑结构光。它的测距本质仍然是三角测量投射器发出的光打在物体表面相机从另一个角度观察物体的不同深度会让亮点在图像上的位置发生水平偏移偏移量和深度一一对应。所以我说它也属于“几何算法”派只不过它不需要场景本身的纹理。Kinect第一代就是一个很典型的单目结构光方案拆开可以看到一个红外投影器和一颗红外相机两者形成固定的基线。它投影的是一幅不规则的散斑图案利用散斑在图像中的局部形变推算深度。当年的体验是近距精度极好手势识别、骨骼跟随都很顺但距离一拉到4米以上就明显吃力。3.2 单目结构光和双目结构光别被名字绕进去很多人看产品介绍会看到“双目结构光”这个词其实这是目前国产深度相机里非常主流的一种架构。它不是把“结构光”和“双目”当作两个并列技术而是组合拳一个红外投影器加两个红外相机。投影器负责向场景撒散斑两个红外相机之间做双目立体匹配散斑的作用是让白墙、光滑桌面这些天然无纹理的区域“长出”足够多的特征点从而让双目的立体匹配稳定工作。换句话说“用结构光救了双目的无纹理短板又用双目的三角测量取代了单目结构光的参考图匹配”。这种方案同时具备结构光近距精度高、双目系统鲁棒性好的特点很多我们常接触到的深度相机厂商包括大家经常买来玩的“大白深度相机”这类国产模组内部方案就是散斑投影加双红外相机采集。我见过有人拆了个国产深度相机发现里面是一个红外点阵投射器加两颗红外摄像头第一反应是“这不是结构光吗”其实它是“双目结构光”的混合方案。理解了这个再选型时看传感器数量、投影器是否存在基本就能判断产品架构了。3.3 结构光的天花板光、距离和材质结构光最大的问题是“光出来的深度怕光”。你在室内用得很好一旦拿到阳光直射的室外投影的红外散斑会被环境中的红外光淹没相机传感器上基本看不清投影图案深度图直接花掉或者大面积空洞。所以传统的单目结构光和很多消费级结构光模组基本只适合室内。距离上因为投影器功率有限投射到远处后光斑会变弱、变稀可识别距离一般也就0.2到5米左右。工业级大功率投影器可以更远但成本和功耗都上去了。材质上高反光的镜面、黑色吸光物体、透明玻璃都会让反射光异常这些材质是结构光的重灾区。你拿结构光相机扫一个黑色皮包或透明水杯深度图经常缺一块。3.4 什么人适合选结构光近距离高精度测距、人脸识别、手势识别、三维建模、医疗口腔扫描这类场景结构光的优势非常明显。因为近距精度高、深度图容易做平滑、对算力要求相对ToF也宽松。刷脸支付的模组、手机里的3D结构光结构基本就是这个思路。如果你做的产品使用场景固定、室内、距离在3米以内结构光是第一选择。4. ToF不给光子算几何直接测往返时间4.1 原理光速已知深度就是时间除以二ToFTime of Flight飞行时间的核心思路和前面两个完全不同它不跟你玩视差和匹配而是直接测量光飞行一个来回需要的时间。深度等于光速乘以时间再除以2因为光要从传感器到目标再回来走的是双倍距离。D (c × t) / 2这个公式看起来简单得可怕但真正的难点在于光速太快了1米的往返只需要大约6.7纳秒。普通电子设备想直接测这种时间规模难度极大所以ToF又分成两条完全不同的技术分支iToF和dToF。4.2 iToF靠相位差间接算时间iToF间接飞行时间目前是消费级ToF的主流。它的传感器不会直接去数纳秒级的时间而是让发光器发射连续的正弦调制波接收端检测返回光的相位与发射光之间的相位差。因为光速已知相位差可以换算成时间再换算成深度。相位差和距离的关系是线性的但所有相位测量都有一个绕不开的周期模糊问题当距离对应的相位超过2π时测出来的距离会“卷”回起点这叫距离模糊。比如调制频率为100MHz时不模糊的最大距离大约是1.5米超过这个距离就会出现“跳变”到近处的假象。所以实际iToF系统通常会用多个频率的调制波交替发射每个频率得到的不同结果互相校验把模糊解掉这个解模糊过程叫多频解包裹。我们项目调试iToF模组时最常遇到的就是远距离深度突然翻到很近一看就是频率解包裹失败。遇到这种问题通常要先检查场景里有没有强反光物体或者多路径反射然后再看频率配置是否合理。4.3 dToF数单光子直接读时间dToF直接飞行时间是近几年从激光雷达领域逐步下沉到深度相机的新方向。它用的是SPAD单光子雪崩二极管传感器可以认为每个像素是一个能够记录“单个光子到达时刻”的超快计时器。发射一个短激光脉冲记录每个光子返回的时间戳多次测量形成直方图峰值对应目标的真实距离。苹果近几年在后置激光雷达里用的就是dToF很多手机上的“雷达扫描仪”也是它。dToF的优势是测量速度快、抗环境光能力强、量程大做车用激光雷达的核心器件也通常是dToF/SPAD体系。但它的瓶颈在于SPAD阵列的分辨率目前普遍不高想做到百万像素的dToF深度图成本和技术门槛都非常高所以目前dToF深度相机的分辨率一般低于iToF和结构光。4.4 ToF的优缺点优势在“省心”短板在“细节”ToF最大的优点从开发者角度看是算法极其简单。它不需要立体匹配不需要投射参考图每个像素独立测距天然不受纹理影响。这意味着在弱纹理、暗光环境里ToF比双目和结构光都稳这也是为什么扫地机器人、自动避障设备大量选用ToF。但ToF也有很强的自身特点分辨率普遍不高。消费级iToF感光芯片一般做到QVGA到VGA级别也就是320×240或640×480想拿ToF出高清点云做精细建模会比较难受。运动伪影问题。ToF在读出一帧时需要一定积分时间物体快速移动或者相机快速晃动时深度图上会出现飞影、边缘拖尾像拍出残影一样。多机干扰。两台ToF同时工作彼此发射的光会被对方检测到深度会产生系统性偏置或噪声点。多台ToF相机同场景部署时要考虑调制频率错开或时序同步。对特殊材质依然“不聪明”。黑色吸光物体、镜面反射、透明材质都会让返回信号变弱或者产生多路径误差深度也容易飘。实际在项目里ToF“不用标定”这一点真的很香。双目动一下要重新标定ToF只要保证出厂校准数据在平时基本不用管对产线和使用者都非常友好。很多产品文档里那些“ToF雷达”比如扫地机的沿墙传感器、手机的距离感应器本质上都是一颗微型ToF传感器只做单点或小范围测距原理和我们聊的ToF深度相机一样只是分辨率非常低。近年越来越多的边缘AI开发平台也开始把ToF数据直接接进去比如NanoEdge AI Studio这类工具可以在MCU上直接跑基于ToF数据的手势识别或人体存在检测进一步拉低了ToF方案的落地门槛。5. 一张表把三种技术横向拆干净5.1 横向对比表这个表我尽量按实际项目中的体感数值来列单位都按消费级和准工业级模组口径工业定制化产品除外。维度双目结构光ToF核心技术三角测量立体匹配编码光投影三角测量光飞行时间测距是否需要主动光源否是红外投影是红外LED/VCSEL脉冲典型量程消费级0.3m-5m取决于基线0.2m-5m0.2m-10mdToF可更远近距离精度1m高纹理充分时很高中等远距离精度3m迅速衰减基本失灵或精度很低相对稳定iToF也衰减dToF更好抗强环境光较好无主动光差日光下基本失效中iToF差一些dToF较好纹理依赖强依赖不依赖场景纹理不依赖场景纹理暗光/无光环境差需要补光可工作投影提供光源可工作深度分辨率/点云密度取决于传感器分辨率可做到较高较高偏低感光芯片分辨率有限帧率取决于算力取决于相机处理速度通常可做高60fps以上算法复杂度高中低标定维护需要严格标定受振动影响大需要标定投影与相机外参出厂校准日常免维护综合成本模组级低传感器便宜但需算力中投影模组贵中高专用ToF芯片贵这个表做完三条路线的性格就出来了双目省钱但费算法、费标定结构光近距好用但怕光、怕远ToF算法省心、抗环境能力强但分辨率低、模组不便宜。5.2 深度误差随距离的变化是选型最重要的知识点很多人选相机只看“标称精度”比如标称“近距离达到1mm”却忽略了精度是一个随距离剧烈变化的函数。双目是典型的高开低走近距离纹理丰富时可以做到亚毫米级到毫米级但误差随距离平方增长3米之后的精度就有点没法看了。结构光在有效量程内精度相对稳定但一旦超过设计量程不是精度降低的问题而是直接没有深度数据。ToF的绝对精度在中远距离相对均匀通常表现为距离的百分之一到百分之二左右2米的误差2到4厘米5米的误差5到10厘米对避障来说完全够用但对精细测量就不够看了。这个曲线决定了应用的场景分工高精度三维测量选结构光或高分辨率双目避障与导航选ToF远距离大范围测距选dToF或者激光雷达而不该选消费级双目。5.3 关于“分辨率”的一个常见误解经常有人拿ToF的分辨率和双目或结构光比说ToF的深度图“糊”。这里要分清两个概念彩色图分辨率和深度图分辨率。ToF的深度图分辨率低是硬伤很多型号确实只有320×240甚至更低。但如果只是做目标检测或避障并不需要那么高的深度分辨率反而高帧率和稳定的弱光表现更重要。反过来如果你要生成精细的三维网格模型用于设计、逆向工程ToF的低分辨率会让你后期非常痛苦。所以“糊不糊”不是单纯看像素而是看你的下游任务吃不吃分辨率。6. 回到真实项目我的选型逻辑和踩坑现场6.1 我是按什么逻辑选的这几年选深度相机我个人会先问自己四个问题工作距离是多少1米内、1到3米、3到10米还是更远工作环境是室内还是室外有没有强光直射对精度要求是高精度测量还是粗粒度避障、检测功耗、算力、标定维护成本能不能承担以这几个问题为标准可以画一个比较粗的决策方向人脸识别、刷脸支付、近距离手势、3D建模优先结构光。精度高、近距离强。室外刷脸设备要加遮阳结构否则强烈日光下很难用。扫地机器人、AGV避障、无人机防撞优先ToF。算法简单弱光可用帧率高非接触式响应快。市面上大量扫地机自称“避障雷达”说白了里面就是ToF。室外物流分拣、无人车、测绘补盲优先双目或dToF。双目胜在成本与户外可用dToF胜在远距离稳定。普通结构光就别硬往户外塞了。成本敏感、算力充足、场景纹理丰富裸双目是性价比之选。室内工业测量、高校实验、视觉抓取这类场景买双目模组非常合适。6.2 踩过的坑按技术路线逐个说第一双目的标定数据问题。前面提过剔除不合格角点是重中之重。后来我们养成一个习惯每批图片标定完成后一定看一眼重投影误差分布和极线校正后的残差不达标就推倒重拍。标定板要贴在玻璃板或铝板上不要用打印纸直接贴墙纸会变形。第二结构光在室外的“花屏”问题。有一年我们在户外闸机项目里用了消费级结构光模组上午十点阳光一晒深度图像素直接飞没了。临时方案是给相机加遮阳罩同时让模组把红外积分时间调到最短把环境光曝光压下来但效果还是不理想。最后换了ToF才解决。后来再给客户方案时只要场景里有“室外”两个字结构光第一时间被排除。第三ToF的多机互扰。停车场检测项目里同时装了好几台ToF相机装好后发现深度图上有规律性的闪烁和带状噪声。排查半天发现是相邻相机互相收到对方的主动光脉冲。后来按厂商建议给每台相机配置了不同的调制频率做了时序错开干扰才消失。如果项目里有多机并排部署提前问清模组支不支持多频调制否则后期加屏蔽非常痛苦。第四反光材质带来的“飞点”。不管哪种深度相机对镜面、高反光物体都会产生飞点也就是深度值突然飘到不可思议的位置。后处理阶段一定要做深度图滤波常用的是时间滤波、空间邻域滤波、中值滤波组合起来把孤立的异常像素清掉。如果下游是抓取或导航这些飞点会让规划器误判障碍物位置必须提前处理。6.3 一个容易被忽略的维度SDK和生态这一点是最后补充的。技术上讲三种方案各有优劣但实际选型时决定你能不能快速量产的不是原理而是模组厂给的SDK、驱动、文档和售后。同样标称参数的产品有的厂商深度图后处理做得好、SDK跨平台封装齐全、相机标定工具成熟开发周期能省一半。我们早期选过一个开源双目方案算法很先进但SDK基本靠社区维护出了问题找不到人项目差点拖没了。后来换了一款有完整SDK支持的双目模组三周就完成集成。所以我的建议是原理搞清楚了最后一定要把“厂商实际服务”放进你的选型评分表里。最后聊两句个人体会。很多人喜欢非黑即白地问“哪种深度相机最好”从我这些年用下来的感受看没有最好的技术只有和场景最匹配的方案。双目像是一个勤奋但挑环境的计算器结构光像是只在舞台上表演的投影师ToF则像一个不挑环境、反应很快的卷尺。把原理搞明白之后你在选型时会少花很多冤枉钱也不会再被产品宣传里的“AI深度”“3D视觉”之类的词汇忽悠。以后遇到一个陌生品牌的深度相机你先看它有没有投影器、有几个红外相机、用到什么传感器基本就能猜个八九不离十。如果还不知道怎么选就拿实际场景里的那几块关键参数——距离、光照、精度、成本——去对比表里套大概率不会跑偏。
返回列表