第1章:编码策略分类——空间编码、时间编码、直接编码的优缺点对比
做结构光这么多年,我经常被问到同一个问题:「到底该选哪种编码策略?」
说实话,没有标准答案。每种策略都有自己的脾气。你想想看,就像选工具一样——锤子不能当螺丝刀用,对吧?
今天我就把三种主流编码策略掰开揉碎了讲清楚。空间编码、时间编码、直接编码,它们各自擅长什么,又有什么坑。这些都是我踩过的坑,希望能帮你少走弯路。
1.1 三种编码策略的核心思想
先看一张图,帮你快速建立整体认知:
这张图是我自己画的,把三种策略的核心特征都标出来了。你看,空间编码在左边,时间编码在中间,直接编码在右边。它们就像三个性格迥异的兄弟——各有各的脾气。
1.2 空间编码——单帧搞定,但精度有限
空间编码,说白了就是只投一帧图案,然后根据每个像素周围邻居的信息来解码。
我最早接触结构光时,用的就是空间编码。当时项目要求测一个快速运动的机械臂,时间编码根本来不及。空间编码就成了唯一选择。
优点
- 速度快:单帧搞定,适合动态场景。我做过一个抓取项目,物体在传送带上跑,空间编码是唯一能用的方案。
- 硬件要求低:普通相机+投影仪就能跑,不需要高速同步。
- 实现简单:De Bruijn序列、M阵列,这些经典方法代码量不大。
缺点
- 精度一般:受限于邻域信息,解码误差通常在几个像素级别。
- 鲁棒性差:物体边缘、遮挡区域容易解码失败。我踩过这个坑——有一次测一个带孔的零件,孔边缘全乱了。
- 分辨率受限:图案本身占用了部分分辨率,实际有效分辨率会打折扣。
我的经验:空间编码适合做粗定位。比如先快速找到物体的大致位置,再用其他方法精测。别指望它一次搞定高精度。
1.3 时间编码——精度高,但慢
时间编码,就是投多帧图案,每帧编码不同的信息,最后组合起来解码。
格雷码、相移法、二进制编码,这些都是时间编码的经典代表。我个人最喜欢相移法,精度高,鲁棒性好。
优点
- 精度高:多帧信息叠加,解码误差可以做到亚像素级别。我做过一个精密测量项目,用四步相移法,精度达到了0.01mm。
- 鲁棒性好:每帧独立编码,抗干扰能力强。环境光变化、表面反射不均匀,影响都不大。
- 解码简单:每帧的编码是独立的,解码逻辑清晰,不容易出错。
缺点
- 速度慢:需要多帧,不适合动态场景。你想想看,投10帧图案,物体早就动到别处去了。
- 硬件要求高:需要高速投影仪和相机同步。我见过有人用普通投影仪做时间编码,结果帧率跟不上,数据全废了。
- 对运动敏感:物体一动,前后帧对不上,解码就乱了。这是时间编码最大的痛点。
注意:时间编码不适合测量快速运动的物体。我曾经试过用格雷码测一个旋转的齿轮,结果解码出来的点云全是扭曲的。后来改用空间编码才搞定。
1.4 直接编码——精度天花板,但娇气
直接编码,就是用灰度值或颜色值直接表示深度信息。每个像素的灰度值直接对应一个深度值。
这种方法精度理论上可以做到最高,但实际用起来问题不少。我做过一次尝试,用256级灰度直接编码深度,结果被表面反射率坑惨了。
优点
- 精度极高:理论上可以达到像素级甚至更高。如果环境理想,直接编码是精度之王。
- 单帧即可:一帧图案就能解码,速度上比时间编码快。
- 实现简单:映射关系清晰,解码逻辑简单。
缺点
- 鲁棒性极差:对表面反射率、环境光、相机噪声都极其敏感。我做过一个实验,同样的图案,换个颜色的物体,解码结果就完全不一样了。
- 动态范围有限:灰度级有限,深度范围受限。256级灰度,能表示的深度范围很有限。
- 校准复杂:需要精确的灰度-深度映射关系,校准过程很麻烦。
一句话总结:直接编码是「实验室里的王者,工业现场的青铜」。如果你在受控环境下做高精度测量,可以试试。但别指望它在复杂场景下表现好。
1.5 三种策略的对比表格
| 对比维度 | 空间编码 | 时间编码 | 直接编码 |
|---|---|---|---|
| 帧数需求 | 1帧 | 多帧(3~20帧) | 1帧 |
| 精度 | 中等(像素级) | 高(亚像素级) | 极高(像素级) |
| 鲁棒性 | 中等 | 好 | 差 |
| 动态场景 | 适合 | 不适合 | 勉强适合 |
| 硬件要求 | 低 | 高 | 中等 |
| 实现难度 | 中等 | 中等 | 高 |
| 典型应用 | 动态抓取、在线检测 | 精密测量、逆向工程 | 实验室研究、特殊场景 |
1.6 我的选择建议
说了这么多,到底怎么选?我个人的经验是:
- 测动态物体:选空间编码。别犹豫,时间编码和直接编码都搞不定。
- 测静态物体,要求高精度:选时间编码。相移法+格雷码组合,效果最好。
- 实验室环境,极致精度:可以试试直接编码。但要做好心理准备,调试过程会很痛苦。
一个小技巧:实际项目中,我经常把空间编码和时间编码结合起来用。先用空间编码快速定位,再用时间编码精测。这样既保证了速度,又保证了精度。
好了,三种编码策略的对比就讲到这里。每种策略都有自己的适用场景,没有绝对的好坏。关键是你得清楚自己的需求是什么。