4、投影仪非线性校正:预补偿法、查找表法、多项式拟合法
做结构光测量这么多年,我踩过最大的坑之一,就是投影仪的非线性问题。你想想看,我们辛辛苦苦设计了一套相移算法,理论上精度能到亚像素级,结果一上投影仪,相位误差直接飙到好几度——这谁受得了?
说白了,投影仪的非线性响应,就是输入灰度值和输出光强不成正比。理想情况下,我输入128的灰度,输出应该是50%的光强。但实际呢?很多商用投影仪在暗区和亮区都有明显的压缩,中间段反而比较线性。这个特性,我们通常用Gamma曲线来描述。
我个人习惯把非线性校正分成三类:预补偿法、查找表法、多项式拟合法。每种方法各有千秋,咱们一个一个聊。
4.1 预补偿法:最直接的思路
预补偿法的想法很简单——既然投影仪会扭曲信号,那我就在发送信号之前,先反向扭曲一下。就像你对着山谷喊话,知道回声会延迟,那就提前一点喊。
具体怎么做呢?先测量投影仪的响应曲线,然后求它的反函数。假设投影仪的响应是 I_out = f(I_in),那预补偿就是 I_in' = f^{-1}(I_target)。
核心步骤:
- 投影一系列已知灰度值(比如0, 32, 64, ..., 255)
- 用相机采集对应的光强值
- 拟合出响应曲线 f(x)
- 计算反函数 f^{-1}(y)
- 对原始条纹图逐像素应用反函数
我在项目中遇到过一种情况:用预补偿法校正后,相位误差从3.2°降到了0.4°。效果很明显,但有个问题——如果投影仪的响应随时间漂移(比如温度变化),预补偿的精度就会下降。
我的经验:预补偿法适合离线标定、固定场景的测量。如果环境温度变化大,建议每次开机后先做一次快速标定。
4.2 查找表法:简单粗暴但有效
查找表法,说白了就是建立一个映射表。输入灰度值,查表得到校正后的灰度值。这个方法的好处是——不需要拟合任何数学函数,直接测量、直接查表。
我曾经在一个项目中,投影仪的非线性特别诡异,多项式拟合怎么都搞不定。后来换成查找表法,问题迎刃而解。为什么?因为查找表法不假设任何数学模型,你测到什么就是什么。
构建查找表的流程:
- 投影N个均匀灰度图(比如N=256,每个灰度值一张)
- 采集每张图的光强响应
- 建立灰度值→光强值的映射关系
- 反过来,建立目标光强→所需灰度值的映射
- 存储为LUT(Look-Up Table)
注意:查找表法的精度取决于采样点数。256级灰度全采样,精度最高,但标定时间也最长。我一般建议采样64~128个点,中间用插值补全。既保证精度,又节省时间。
嗯,这里要注意一点——查找表法对存储空间有要求。一个256级的LUT只需要256字节,但如果你要做亚像素级的校正,可能需要更大的表。不过现在嵌入式设备的Flash都够用,这个不是大问题。
4.3 多项式拟合法:数学之美
多项式拟合法是我个人最喜欢的方法。为什么?因为它用一个简洁的数学表达式,就能描述整个非线性响应。你想想看,一个三次多项式,四个系数,就能搞定大部分投影仪的非线性校正。
常用的模型是:
I_out = a0 + a1 * I_in + a2 * I_in^2 + a3 * I_in^3
或者更精确的Gamma模型:
I_out = a * I_in^γ + b
拟合步骤:
- 采集多组 (I_in, I_out) 数据点
- 用最小二乘法拟合多项式系数
- 得到校正函数 I_corrected = P(I_measured)
- 对原始条纹图逐像素应用校正函数
避坑指南:我曾经用五次多项式拟合一个老旧投影仪,结果过拟合了——在校准点上误差很小,但校准点之间的区域反而误差更大。后来我改成三次多项式,效果反而更好。所以,不是阶数越高越好,三次或四次通常就够用了。
4.4 三种方法的对比
为了让你看得更清楚,我整理了一个对比表:
| 方法 | 精度 | 计算量 | 存储需求 | 适用场景 |
|---|---|---|---|---|
| 预补偿法 | 中高 | 低 | 低 | 实时性要求高的场景 |
| 查找表法 | 高 | 中 | 中 | 非线性特性复杂的投影仪 |
| 多项式拟合法 | 中高 | 低 | 极低 | 嵌入式系统、资源受限设备 |
我个人建议:如果你刚开始做结构光,先从多项式拟合法入手。它简单、高效,而且能让你理解非线性的本质。等遇到更复杂的情况,再考虑查找表法或预补偿法。
4.5 知识体系总览
下面这张图,是我画的本章节知识结构。你可以看到三种方法之间的关系,以及它们在整个校正流程中的位置。
最后说一句心里话:非线性校正这件事,看起来是小事,但做不好,整个测量系统的精度都会受影响。我见过太多人花大价钱买高精度相机、镜头,却在投影仪校正上敷衍了事。结果呢?相位误差大得离谱,三维重建出来的点云全是波浪形的。
所以,别小看这一章的内容。把非线性校正做好了,你的结构光测量系统才算真正入了门。