4. 核心传感器原理(二):结构光编码策略(格雷码、相移法)、投影仪与相机的同步机制

好,咱们接着聊结构光。上一章我把投影仪和相机的基本模型讲透了,这一章咱们要啃的,是结构光系统里最核心的“编码”问题。

说白了,结构光三维扫描的本质是什么?就是让投影仪往物体上打一系列“有规律”的光图案,相机拍下来,然后通过分析图案的变形,算出每个像素的深度。那问题来了——这些“有规律”的光图案,到底该怎么设计?

我个人习惯把编码策略分成两大类:空间编码时间编码。空间编码一张图搞定,适合动态场景,但精度有限。时间编码需要多张图,精度高,适合静态物体。咱们做高精度工业扫描,几乎清一色用时间编码。今天重点讲两种最经典的时间编码:格雷码相移法

4.1 格雷码:从二进制到“防呆”编码

先说说格雷码。你想想看,如果我们直接用二进制编码,比如从0111(7)变到1000(8),所有位都翻转了。投影仪和相机在捕捉这个变化时,只要有一点点不同步,就可能把0111误判成1111或者0000。这在三维重建里就是灾难性的噪声。

格雷码的巧妙之处在于:相邻两个数值之间,只有一位不同。比如7(0100)到8(1100),只变了最高位。这样即使同步有点偏差,误差也最多是一个像素,不会出现“跳码”式的错误。

核心公式:二进制转格雷码

// 二进制转格雷码
uint16_t binaryToGray(uint16_t num) {
    return num ^ (num >> 1);
}

// 格雷码转二进制
uint16_t grayToBinary(uint16_t gray) {
    uint16_t binary = gray;
    while (gray >>= 1) {
        binary ^= gray;
    }
    return binary;
}

我在项目中遇到过一件事:有次用8位格雷码做扫描,投影仪分辨率是1280×720。我一开始没注意,直接用了8位编码,结果发现横向编码条纹太密,相机根本分辨不清。后来我改成6位格雷码 + 2位相移,效果就好多了。嗯,这里要注意:格雷码的位数决定了空间分辨率。n位格雷码可以把投影仪列方向分成2ⁿ个区域。但位数太多,条纹太密,相机可能拍不清楚。

我的经验:对于常见的工业相机(比如500万像素),格雷码位数一般取6~8位。超过10位,条纹宽度小于2个像素,解码就容易出错。

4.2 相移法:亚像素精度的秘密

格雷码能做到像素级精度,但咱们做工业测量,往往需要亚像素精度。这时候就得请出相移法了。

相移法的原理其实很简单:投影一组正弦条纹图案,每张图案的相位偏移一定角度。相机拍下来后,通过解相位公式,可以算出每个像素的“包裹相位”。这个相位值在0到2π之间,对应着投影仪上的亚像素位置。

三步相移法公式:

I1(x,y) = A + B * cos(φ(x,y))
I2(x,y) = A + B * cos(φ(x,y) + 2π/3)
I3(x,y) = A + B * cos(φ(x,y) + 4π/3)

// 解包裹相位
φ(x,y) = atan2(√3 * (I1 - I3), 2*I2 - I1 - I3)

你可能会问:为什么是三步?其实四步、五步、甚至十二步相移都有。步数越多,抗噪声能力越强,但采集时间也越长。我个人习惯:静态场景用三步或四步,动态场景用两步(但两步精度会差一些)。

不过相移法有个大坑:包裹相位是周期性的。也就是说,你算出来的相位值在0到2π之间,但你不知道它是第几个周期。这就需要和格雷码配合——格雷码提供“周期序号”,相移法提供“周期内位置”。两者结合,就能得到绝对相位。

我曾经踩过的坑:有次做高反光物体扫描,相移条纹在镜面区域完全过曝,解出来的相位全是乱的。后来我加了多曝光策略——对同一组条纹拍三组不同曝光时间的图像,然后合成HDR相位图。效果立竿见影。

4.3 格雷码 + 相移法:黄金搭档

在实际工程中,很少有人只用格雷码或只用相移法。标准的做法是:格雷码做粗定位,相移法做精定位

具体流程是这样的:

  1. 投影n位格雷码图案(比如6位),相机拍摄,解码得到每个像素的“区域编号”(0~63)
  2. 投影m步相移图案(比如4步),相机拍摄,解包裹相位得到“周期内相位”(0~2π)
  3. 将区域编号和周期内相位组合,得到绝对相位值
  4. 根据绝对相位和三角测量原理,计算三维坐标

这样做的好处很明显:格雷码解决了相移法的“周期歧义”问题,相移法弥补了格雷码的“像素级精度”不足。两者互补,堪称黄金搭档。

绝对相位计算公式:

Φ(x,y) = 2π * k(x,y) + φ(x,y)

其中k(x,y)是格雷码解码得到的周期序号,φ(x,y)是相移法解出的包裹相位。

4.4 投影仪与相机的同步机制

讲完了编码策略,咱们聊聊一个经常被忽视但极其重要的问题:同步

你想想看,投影仪在切换图案时,如果相机刚好在“换图”的瞬间曝光,拍到的就是一张“半黑半白”的过渡图案。这种图像拿去解码,结果可想而知。

我见过很多初学者,直接用软件触发——投影仪显示一张图,相机拍一张,然后投影仪再显示下一张。这种方式最大的问题是:时序不可控。投影仪的刷新率是60Hz或120Hz,相机的曝光时间可能只有几毫秒,两者之间没有硬件同步信号,很容易拍到过渡帧。

正确的做法是使用硬件同步

  • 投影仪输出一个“帧同步信号”(VSYNC)
  • 相机检测到这个信号后,在投影仪显示稳定图案的“有效区间”内触发曝光
  • 曝光完成后,相机输出“曝光结束信号”,通知投影仪切换到下一张图案

我的建议:如果预算允许,尽量用支持“Pattern Sequence Mode”的投影仪和相机。比如DLP LightCrafter系列投影仪,可以预存多张图案,通过硬件触发自动切换。这样能实现100fps以上的高速扫描。

如果只能用软件同步,也有补救办法:在每张图案前加一张“全黑”或“全白”的过渡帧。这样即使拍到过渡帧,也是全黑或全白,不会影响解码。代价是采集时间翻倍。

4.5 知识体系总览

为了让你更直观地理解本章的知识结构,我画了一张流程图:

结构光编码策略与同步机制知识体系 结构光编码策略 时间编码 空间编码 格雷码(粗定位,像素级) 相移法(精定位,亚像素级) 格雷码 + 相移法(黄金搭档) De Bruijn序列 / 彩色编码 单帧解码,适合动态场景 投影仪与相机同步机制 硬件同步(VSYNC触发) 软件同步(过渡帧补偿)

这张图把本章的核心内容串起来了。你可以看到,时间编码(格雷码、相移法)是我们做高精度扫描的主力,空间编码更多用于特殊场景。而同步机制,则是保证这一切能正常工作的“基础设施”。

好了,这一章的内容就到这里。格雷码和相移法的数学原理、代码实现、以及同步机制的工程细节,我都尽量用实际经验给你讲透了。下一章咱们会深入讲相机标定和投影仪标定的具体操作流程——那才是真正动手干活的部分。


公众号:蓝海资料掘金营,微信deep3321