
普通 RGB 相机拍出来的照片能告诉你这东西长什么样但它说不出这东西离我多远、有多大、在不在移动。深度摄像头解决的恰恰是后面这件事——它给画面里的每一个像素都附带一个距离值让机器第一次具备了空间感。这张深度图向上可以拼出三维点云做重建、测量、抓取向下可以喂给避障、SLAM、手势交互这类算法。如果你在做机器人、三维扫描、体积测量、工业检测或者 AR/VR 相关的东西深度摄像头大概率会在你的物料清单里出现而如果你只是想搞清楚它到底怎么工作、为什么同一场景下不同模组表现差那么多这篇内容也够用。我前后折腾过双目、结构光、ToF 这几条路线的模组从几十块的玩具级到工业级都摸过踩的坑不比写过的代码少下面就把这些东西摊开讲。1. 深度摄像头和普通相机差在哪从像素到距离的那一步跨越1.1 一张深度图里到底存了什么先把最容易被误解的地方说清楚深度摄像头输出的不是更立体的一张照片而是一张每个像素值代表距离的标量图。它通常还带一路 RGB但那路 RGB 只是配菜主菜是那张看起来灰蒙蒙、只有轮廓没有细节的深度图。深度图的分辨率往往比 RGB 低常见 640×480、848×480好一点的 1024×768因为每算一个深度值都要付出额外的光学或计算代价不像感光那样可以暴力堆像素。一张典型的深度图长这样靠近相机的物体偏亮数值小远处偏暗数值大完全没有回波的地方是 0 或者某个约定的无效值。你会发现桌子边缘有一圈毛刺玻璃窗位置是个洞或者一片混乱的数值黑色显示器背板上是一片空洞。这些不是设备坏了而是测距物理本身在这些条件下的必然结果后面第 6 章会逐条解释为什么。深度图的价值在于它是可计算的几何。有了它你就能从二维图像反推三维坐标进而做体积、做定位、做抓取。RGB 图像给不了这个能力因为同一张二维图像可以对应无穷多种三维世界——这就是经典的透视歧义。1.2 深度图的三种常见数据语义别搞混拿到一台新设备第一件事不是写算法而是搞清楚它吐出来的数据到底是什么单位、什么语义。我见过太多次因为单位搞错导致点云尺度差了 1000 倍整个标定链条全废。数据格式典型取值含义转换方式常见来源uint16 原始值距离 / depth_scale乘以 scale常为 0.001 m多数 ToF、结构光模组float32 米直接就是米直接用部分工业相机、SDK 转换后视差图 disp像素级视差Z fx·B / disp双目、立体匹配输出uint16 是一个很讨巧的设计65535 × 0.001 m 65.5 m绝大多数室内场景够用而且比 float32 省一半带宽。但不同厂商的 scale 不一样有的用 0.001有的用 0.00025有的干脆在 SDK 里给一个get_depth_scale()接口让你查。我的习惯是初始化后立刻把这个值打印出来记在配置文件里而不是靠记忆。视差图那一类要特别注意视差和深度是反比关系视差为 0 的区域意味着无穷远或者匹配失败做除法时会直接产生 inf。做双目的时候如果不做无效值掩膜后面一定会被 inf 和 nan 咬一口。1.3 为什么深度比颜色难获取这么多颜色是被动接收的光子打到感光芯片上产生电荷事情就结束了。深度是主动推断的无论走哪条技术路线都要在硬件或算法层面额外做一件事建立像素与真实距离之间的映射关系。被动双目靠的是两个视角之间的三角关系代价是需要纹理没有纹理就没法匹配结构光靠的是投射已知图案再解算形变代价是对环境光和被测材质敏感ToF 靠的是光的往返时间代价是需要高速调制和大量光子积累功耗和成本都上去了。每一条路线都是拿一种麻烦去换另一种麻烦不存在通吃的方案。这也解释了为什么工业界经常同时挂两三种传感器一台深度相机用于大范围粗定位一把线激光轮廓仪用于局部高精度测量各自干自己擅长的那一段。2. 四条主流测距路线的取舍双目、结构光、iToF/dToF、激光轮廓2.1 双目立体视觉最便宜也最挑场景双目是原理最朴素的一条路两个相机平行摆放基线距离 B 已知同一个物理点在左右图上的横坐标差就是视差 d深度由三角关系给出Z (fx · B) / d其中 fx 是焦距换算到像素单位后的值B 是基线长度米d 是视差像素Z 就是距离米。举个具体数fx 1000 pxB 0.06 m视差算到 10 px那 Z 1000 × 0.06 / 10 6 米。反过来视差越小对应距离越远当视差缩到亚像素级别比如 0.1 px时距离已经到 600 米——当然实际根本到不了因为此时的误差已经大得离谱。双目最大的优点是成本低、被动、无红外发射、不会互相干扰多台同开也没问题。缺点同样明显纯色墙面、白纸、玻璃这些没有纹理的表面匹配算法找不到对应点直接出空洞在低照度下两个相机都看不清深度也就无从谈起。所以双目方案通常要配一个纹理投射器不可见光散斑投射这就变成了主动双目本质上已经和结构光沾边了。2.2 结构光近距离高精度的代价结构光的思路是既然没纹理那我就投一个纹理上去。投影器发出已知的图案点阵、条纹、伪随机散斑相机拍下图案在被测表面上的形变通过投影器与相机之间的基线做三角测量解出每个点的深度。这条路线在 0.3 米到 1.5 米这个区间里精度非常能打早期的人脸识别、手势交互、近距离三维扫描大量采用。它的软肋也很清晰投射功率受限于人眼安全在强阳光下图案直接被淹没多台设备同开会互相看到对方的散斑产生伪匹配对黑色吸光材质和镜面反射材质表现很差因为回波太弱或者被反射到别的方向去了。结构光的精度和基线、投射图案的周期密切相关也是一个随距离平方衰减的规律。放在扫描仪、人脸支付、近距离抓取这种工作距离固定且短的场景里最合适。2.3 飞行时间从相位法到单光子计数ToF 是直接测光的往返时间或者相位差。它有两个分支别混为一谈。iToF间接飞行时间发射的是连续正弦调制光接收端测量回波相对于发射信号的相位延迟 φ距离由下式给出d (c · φ) / (4π · f_mod)c 是光速f_mod 是调制频率。注意这里有个致命约束相位只能测到 2π超过就产生模糊。最大无模糊距离是d_max c / (2 · f_mod)f_mod 100 MHz 时d_max 3×10⁸ / (2×10⁸) 1.5 米。想测更远就得降低调制频率但精度又跟着下降。工程上的标准做法是用多个频率同时调制用低频解模糊、用高频保精度这就是所谓双频或三频解调。iToF 的多径干扰比较讨厌光打到墙角再反射回来会算出一个折中的距离导致墙角出现错误的圆角。dToF直接飞行时间走的是另一条路发一个极短的脉冲用 SPAD单光子雪崩二极管阵列统计回波光子到达的时间形成一个时间直方图直方图的峰值位置就是飞行时间。它天然支持多回波能同时区分玻璃前表面和后面的物体量程也更容易做远代价是需要大量累积帧数来提高信噪比而且 SPAD 阵列的像素做不大分辨率通常偏低。一句话总结近距离高分辨率用 iToF远距离、强环境光、多回波需求用 dToF。2.4 线激光与激光雷达被忽略的工业主力严格说线激光轮廓仪不算摄像头但在产线上它是绝对主力。它投射一条激光线用相机拍下线的形状逐条扫描出剖面再由运动机构拼出完整三维。精度可以做到微米级重复性好到离谱缺点是必须配合运动或者需要扫描机构单帧拿不到整个面。而扫描式激光雷达机械旋转或半固态本质上是用一条测距光束去扫面输出的是稀疏点云。它不用来做稠密重建用来做定位、避障、大范围测绘很合适。把激光雷达和相机做外参标定融合是很常见的组合拳视觉给语义、激光给几何。3. 选型时必须盯死的硬指标以及它们背后的数学3.1 量程、基线与焦距一个公式决定一切很多人选型只看最大量程多少米这是最容易上当的指标。量程标 10 米不代表 10 米处能用——它往往只代表 10 米处还能返回一个非零值精度可能已经差到 30 厘米。回到双目的公式 Z fx·B/d把它对 d 求导得到深度误差的传递关系ΔZ (Z² · Δd) / (fx · B)这个式子信息量极大。深度误差与距离的平方成正比与焦距和基线成反比。代入一组数fx·B 50fx1000 pxB0.05 m视差测量误差 Δd 取 0.1 px亚像素匹配的典型水平那么在 Z 1 米处 ΔZ (1 × 0.1)/50 2 毫米到了 Z 5 米处ΔZ (25 × 0.1)/50 50 毫米。同一个相机距离拉远 5 倍误差涨了 25 倍。这就是为什么所有深度相机的参数表都会给你一条精度-距离曲线而不是一个固定的精度数字。看到只给一个数字的基本可以判断是营销材料。iToF 和结构光的误差传播规律类似也大致是平方关系。所以选型第一个问题永远是我的工作距离是多少如果只要 0.3~1 米选个近距离小基线的高精度模组就够如果要 5 米开外就得接受厘米级误差或者换 dToF。3.2 深度分辨率随距离平方衰减这才是真正的瓶颈承接上面的结论实战中最容易被忽视的一个坑是明明量程够但远处的物体边缘糊成一团分割算法做不了。原因是深度分辨率能区分的最小距离差同样随距离平方衰减。上面算出来 5 米处 ΔZ 5 厘米意味着 5 米外一个 3 厘米厚的纸板深度图里根本分不出前后。如果你的应用是做远处的目标检测加测距光有深度不够还得配高分辨率 RGB 做识别深度只负责测距。第二个相关概念是横向分辨率在距离 Z 处一个像素对应的实际物理尺寸约为w Z / fxfx 1000 px 时1 米处一个像素约 1 毫米5 米处就是 5 毫米。这个值决定了你能分辨多细的结构。做小零件检测的时候如果像素尺寸比特征还大再好的算法也无能为力。3.3 视场角、分辨率与盲区的三角约束FOV、分辨率、盲区这三者之间存在硬性的几何约束无法同时优化。视场角决定了你能看多宽。FOV 大边缘畸变大标定和去畸变难度上升。分辨率决定了角分辨率。同样的 FOV 下分辨率越高每个像素张角越小能分辨的细节越多但数据量和带宽也越大。**盲区最小工作距离**由基线和 FOV 共同决定。基线和投影器之间存在视差太近的地方投影图案和相机视野不重叠就没法测。双目相机贴到 10 厘米以内基本就废了。一个典型的取舍机器人避障需要广角看四周通常选 90° 以上的 FOV代价是分辨率被摊薄远处基本没数据体积测量需要精确贴近货物选中等 FOV 加短盲区。这两个需求不能用同一台设备满足硬凑只会两头不讨好。3.4 抗环境光、材质适应性与多机干扰这三个指标在参数表里经常是缺失的但在真实场景里往往是决定成败的关键。抗环境光室内普通照明几百 lux所有设备都能扛但靠窗有阳光直射几万到十几万 lux时结构光和 iToF 基本都会崩因为有用的调制信号被背景光淹没了。判断方法很简单看厂商给的推荐照度范围或者直接问有没有阳光下的实测数据。dToF 在这方面的表现通常好一些因为它靠的是时间统计而不是幅度对比。材质适应性拿一块黑色哑光板、一块镜面不锈钢、一块透明亚克力在同一个距离下测三遍对比有效像素比例和噪声这是我最常用的一套土办法评估。对深度相机来说黑色、镜面、透明是三道坎能全过的方案几乎没有只能看哪个对你的场景影响最小。多机干扰结构光和 iToF 同频同开时会互相干扰。多台结构光相机会看到彼此的散斑产生虚假匹配iToF 之间会因为相位调制频率接近而互相污染。解决办法有几种错开曝光时序需要硬件触发同步、错开调制频率、或者在空间上拉开角度。选购前如果有多机需求一定要问清楚厂商支持不支持外部触发和频率配置。4. 从插上线到跑出第一帧点云一条能复现的实操链路4.1 环境与驱动先把权限和内核这两关过了Linux 下第一次插设备跑不起来九成是权限问题。普通用户默认没有 USB 设备的读写权限SDK 会报找不到设备或者permission denied。加一条 udev 规则就能解决# /etc/udev/rules.d/99-depth-camera.rules SUBSYSTEMusb, ATTRS{idVendor}8086, MODE0666idVendor 换成你设备的实际厂商 ID用lsusb查。写完规则执行sudo udevadm control --reload-rules sudo udevadm trigger然后重新插拔。另一类问题是 UVC 元数据。很多深度相机在彩色流之外还走 UVC 的元数据通道内核默认可能没启用需要加载模块时加参数sudo modprobe uvcvideo quirks128这个 quirk 值让驱动把元数据当普通数据流处理。有些发行版还得更新内核版本因为旧内核的 uvcvideo 不支持一定宽度以上的元数据。别问我怎么知道的为了一个设备识别到了但取不到流的问题我查过整整一个下午的内核日志。4.2 取流、对齐与深度尺度换算跑起来之后的第一件事是确认数据是对的。下面这段是最小可用示例思路是取深度流加彩色流、做对齐、换算成米import numpy as np import pyrealsense2 as rs pipeline rs.pipeline() config rs.config() config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) profile pipeline.start(config) # 深度尺度把 uint16 原始值换算成米 depth_sensor profile.get_device().first_depth_sensor() depth_scale depth_sensor.get_depth_scale() print(depth_scale , depth_scale) # 常见 0.001 # 把深度图对齐到彩色相机坐标系 align rs.align(rs.stream.color) try: while True: frames pipeline.wait_for_frames() aligned align.process(frames) depth_frame aligned.get_depth_frame() color_frame aligned.get_color_frame() if not depth_frame or not color_frame: continue depth np.asanyarray(depth_frame.get_data()).astype(np.float32) * depth_scale color np.asanyarray(color_frame.get_data()) print(有效像素比例 %.3f % (np.count_nonzero(depth) / depth.size)) finally: pipeline.stop()这段代码里有两个点值得强调。一是深度尺度必须先读再乘不要假设是 0.001。二是对齐很重要深度相机和彩色相机有物理间距两组像素不对应直接拿同一个 (u, v) 去取深度和颜色会错位几厘米。对齐操作会做一次重投影把深度图变换到彩色相机的视角下代价是边缘区域会出现无效值。4.3 深度图转点云内参、外参与坐标系深度图转点云靠的是相机内参。每个像素 (u, v) 和它的深度 Z 决定一个三维点X (u - cx) · Z / fx Y (v - cy) · Z / fy Z Zfx、fy、cx、cy 就是内参SDK 一般都能直接给intr depth_frame.get_intrinsics() print(intr.fx, intr.fy, intr.ppx, intr.ppy, intr.model, intr.coeffs)注意在已对齐的情况下必须用彩色相机的内参来反投影而不是深度相机原来的内参——这一步搞错点云会整体缩放或者偏移而且不容易一眼看出来。用 Open3D 可以直接从对齐后的彩色图和深度图生成点云import open3d as o3d color_raw o3d.io.read_image(color.png) depth_raw o3d.io.read_image(depth.png) rgbd o3d.geometry.RGBDImage.create_from_color_and_depth( color_raw, depth_raw, depth_scale1000.0, # 和上面 depth_scale 对应 depth_trunc3.0, # 超过 3 米直接截断减少噪声 convert_rgb_to_intensityFalse) intrinsic o3d.camera.PinholeCameraIntrinsic( 640, 480, fx, fy, cx, cy) pcd o3d.geometry.PointCloud.create_from_rgbd_image(rgbd, intrinsic) # 相机默认朝 Z可视化时把它转到更直观的朝向 pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]]) o3d.visualization.draw_geometries([pcd])depth_trunc这个参数我强烈建议设别省。远处的深度噪声会被映射成一大片飘在空中的散点把近处的结构全遮住。4.4 我的标定流程预热、平面板与重复性验证出厂标定只能保证能用不能保证够准。如果你的应用涉及毫米级测量必须自己验证一遍。我的流程是这样的设备开机预热 20 到 30 分钟让传感器温度稳定下来温漂在这个阶段最明显然后把一块平整的白板或标定板放在工作距离处正对相机测一遍平面度——如果深度图上的平面起伏标准差超过你精度要求的一半就要留意了接着把板子沿深度方向移动几个位置每个位置记录中心区域的平均深度和卷尺量出来的真值对比画一条误差曲线。平面度验证还有个小技巧用红外摄像头手机前摄改装的或者专门的 IR 相机去看结构光投射的图案图案是否清晰均匀、有没有暗斑或者畸变能直观反映投影器的状态。这个动作还能帮你判断环境光干扰的程度——在 IR 图里阳光是很强的背景噪声。5. 拿到点云之后滤波、配准与常见后处理5.1 无效值、飞点与边缘混合像素的处理原始深度图有三个常客无效值0、飞点flying pixels、以及边缘处的混合像素。无效值就是没测到直接掩膜掉即可。飞点出现在物体边缘因为一个像素的视场内同时包含了前景和背景算法算出了一个介于两者之间的距离结果就是边缘处飘着一些空中点。这类点在点云里非常显眼做分割的时候会造成误判。处理方法有几种。最简单的是基于邻域一致性滤波如果一个点和它 8 邻域的点深度差超过阈值就判定为飞点。Open3D 里有现成的统计离群点移除cl, ind pcd.remove_statistical_outlier(nb_neighbors20, std_ratio2.0) pcd_clean pcd.select_by_index(ind)nb_neighbors是邻域点数std_ratio是标准差倍数阈值值越小过滤越狠。实测下来 20 和 2.0 是个不错的起点具体按噪声水平调。还有一种是边缘膨胀直接把深度图的边缘区域标记为无效。代价是边缘精度下降但如果你的应用只关心物体内部这个做法最省事。5.2 时域滤波与多帧融合单帧深度图的噪声是随机的而静态场景下多帧的均值能显著降噪。很多 SDK 内置了时域滤波temporal filter原理是用当前帧和历史帧做加权平均权重和深度差异挂钩——差异小的加大权重差异大的减小权重这样既降噪又不会在运动时拖影。如果 SDK 没有自己实现也不难维护一个环形缓冲对每个像素做中值或者指数加权平均。要注意的是在有运动的场景下时域滤波会引入鬼影需要在运动和静止之间切换策略。我的做法是先用深度差分判断像素是否静止静止的走时域滤波运动中的走单帧双边滤波。双边滤波spatial filter是空间域的能在保边的同时平滑噪声。它在平滑的同时保留边缘非常适合深度图但计算量比均值滤波大。实时性要求高的场景下可以考虑降采样之后处理再上采样。5.3 点云配准与坐标变换链如果你要做多视角拼接或者把深度数据放到机器人基坐标系里就绕不开配准和外参标定。粗配准常用 RANSAC FPFH 特征精配准用 ICP。ICP 对初值敏感初值差太多会收敛到局部最优所以通常先用特征做粗对齐。坐标变换链要理清楚像素 - 相机坐标系 - 相机外参 - 机器人基坐标系。每一段都是一次刚体变换写成矩阵乘法的形式。这条链上任何一环标错最后的结果就是看起来差不多但就是抓不准。我的经验是每一步都单独验证相机内参用平面板验证手眼标定用已知位置的标记点验证别指望一步到位。手眼标定的误差会随距离放大。如果工作距离是 1 米标定误差 2 毫米那么到 2 米处就可能变成 4 毫米以上。所以标定的时候尽量在真实工作距离处采集数据。6. 踩坑实录那些让深度图直接废掉的场景6.1 反光、透明与纯黑三种物理级失效这三种失效不是算法问题是物理问题任何后处理都救不回来。镜面反光光打在镜面上被镜面反射到别的方向去了相机收不到回波深度是空的。更麻烦的是如果镜面反射恰好把别处的光反射进相机还会测出一个完全错误但看起来合理的距离。我遇到过一面不锈钢板深度图显示它比实际位置近 40 厘米因为相机看到了反射的另一个物体。透明材质玻璃、亚克力这类材料一部分光反射回来、一部分透过去。iToF 因为多径效应会算出一个前后之间的中间值dToF 运气好的话能通过多回波区分出前表面。实际处理中玻璃区域通常直接标记为不可信。纯黑吸光黑色哑光表面吸收大部分入射光回波极弱。结构光和 iToF 在黑色物体上有效像素比例可能掉到一半以下。解决方案一般是提高曝光时间代价是帧率或者叠加多帧物理上没办法。实用建议如果你的场景里这三种材质占比超过 20%提前准备好无效区域的兜底策略比如用 RGB 做语义分割补充或者干脆换用对材质不敏感的 dToF。6.2 多机同开与红外互扰这个坑我在一个多机器人项目里被狠狠教育过。三台同型号结构光相机在一个房间里同时工作结果每台的深度图里都出现了规律的条纹噪声某些区域测距直接偏了几十厘米。原因是每台设备的散斑图案本质上是一样的A 相机看到了 B 相机投的散斑以为是自己的图案就算出了错误的深度。改法有几种硬件上做触发同步让它们分时曝光需要支持外触发软件上错开投射图案的编码需要厂商开放配置实在不行就在物理上拉开角度让每台设备的视野尽量不重叠。iToF 之间也有类似问题特别是调制频率接近的时候。选购多机方案前务必确认设备支持的同步方式和可配置的频率档位这个信息通常在技术手册的深处要主动问。6.3 带宽、线缆与供电引发的不稳定跑一会儿就掉帧、偶尔丢设备、换台电脑就好了这三个症状几乎都指向物理层。USB 带宽是硬约束。以 640×48030fps 为例深度 uint16 是 640×480×2×30 ≈ 18.4 MB/s加上彩色 640×480×3×30 ≈ 27.6 MB/s加起来约 46 MB/s。USB 3.0 理论 5 Gbps 够用但如果同一个控制器上挂了多个设备或者线材质量不达标就会开始丢包。解决办法是把设备分散到不同的 USB 控制器上用lsusb -t看拓扑或者降低分辨率。线缆长度也是问题。USB 3.0 无源线超过 3 米信号质量就开始下降超过 5 米基本不可靠。长距离要用有源延长线或者光纤延长。这个坑很阴因为线短的时候一切正常换成长线才出问题很容易误判成软件 bug。供电不足会导致设备反复重启。有些模组功耗不小尤其是带主动投射的用 USB Hub 供电可能不够。直接插主板后置 USB 口是最稳的。6.4 温漂与昨天还好好的深度相机对温度敏感尤其是 ToF 和结构光因为光源波长和传感器响应都会随温度变化。开机初期温度在爬升测距值会缓慢漂移通常 15 到 30 分钟后才趋于稳定。如果冷启动就标定等设备热了之后误差可能到几毫米甚至更多。我现在的做法是任何精度相关的测试都先让设备运行半小时长期部署的场景要么做温度补偿周期性用已知距离的参考物修正要么在标定时记录温度并留出余量。另一个昨天还好好的的典型原因是机械松动。相机被撞了一下、支架螺丝松了、镜片上有指纹都会导致精度突变。我一般会固定一个健康检查流程每次开机后测一次固定位置的平面板数值偏离超过阈值就报警。这个习惯帮我省了很多排查时间。7. 典型落地场景与我见过的选型结论7.1 机器人避障与 SLAM机器人避障对深度的要求是广度优先视野要宽、帧率要高、近距离盲区要小精度反而是次要的厘米级就够用。这类场景我一般推荐广角 dToF 或者主动双目理由是抗环境光好、功耗低、多机不打架。SLAM 用深度相机的话要注意深度图的噪声会直接影响位姿估计。稠密 SLAM 通常会把深度图降采样、滤波之后再用或者干脆只取稀疏特征点再加深度做尺度恢复。纯用深度做里程计的话边缘飞点和无效区域是主要误差源前端的剔除外点策略要做足。要注意的一点是机器人在运动时对时域滤波很敏感。前面说过时域滤波会拖影运动状态下反而会引入错误。有些方案会在检测到运动时自动降低滤波强度这个逻辑要自己实现的话用帧间深度差分做判断即可。7.2 体积测量与物流物流场景测包裹体积核心诉求是精度和盲区。包裹尺寸从 10 厘米到 1 米不等测量误差通常要求在 1% 到 2% 以内。这类应用我倾向选中等 FOV、短盲区、近距离高精度的方案工作距离控制在 0.5 到 1.5 米。实际做的时候有个细节包裹表面往往是纸箱漫反射好测和胶带有反光偶尔出洞。孔洞处理不好会直接影响体积计算。我的做法是先做形态学闭运算填补小孔再用凸包或者包围盒算法算体积而不是直接对点云积分。直接积分的话一个洞就能让体积偏小好几个百分点。还要注意姿态。倾斜的包裹如果直接算轴对齐包围盒体积会偏大需要先做平面拟合把顶面找出来再算。7.3 人机交互与手势手势识别、人脸支付的场景通常工作距离短0.3 到 1 米、精度要求高、但对帧率要求没那么极致。结构光在这个区间性价比最高近距离精度能到毫米级。这里最大的坑是手在动。手部运动速度可以达到每秒一米以上如果时域滤波开得太强手部轮廓会糊成一团。另外手是多关节、非刚性的深度图的遮挡区域手指互相遮挡会比较多算法层面要能容忍这些空洞。肤色对红外反射率有一定影响深色皮肤的回波会弱一些如果产品要面向多肤色用户测试集一定要覆盖到别等到上线才发现某些用户识别率明显下降。7.4 工业检测工业检测是深度相机最卷的场景精度要求从毫米级到微米级都有。微米级的场合一般不用面阵深度相机而是用线激光轮廓仪毫米级的面检测可以用高精度结构光。工业现场的两个额外挑战是环境光车间照明、焊接弧光和振动。照明方面尽量用窄带滤光片把环境光滤掉只让投射器的波长通过振动方面相机和被测物都要刚性固定并且要考虑补偿。温度这块在工业场景影响更明显因为精度要求高。长时间运行的产线上最好做周期性的在线校准用一个已知尺寸的标准件做参考自动修正漂移。关于选型我的整体建议是先明确工作距离和精度要求这两个硬约束再在满足约束的方案里比抗环境光和多机能力最后才看价格。顺序反了很容易买了一台参数漂亮但用不了的设备。我个人在实际操作中的体会是深度相机这个东西参数表只能告诉你它能做什么真正的边界要靠自己在目标场景里实测出来——带上黑色板、镜面片、透明片和卷尺去现场跑一遍比在办公室里看十份规格书都有用。