3. 投影仪模型与标定:逆相机模型、内参标定与联合标定
好,我们进入第三章。这一章讲的是投影仪的模型和标定。说实话,很多做结构光的朋友,一开始都把精力放在相机标定上,觉得投影仪嘛,就是个投光的工具。但真正做过系统的人都知道——投影仪才是整个系统的“灵魂”。它的精度,直接决定了三维重建的上限。
我个人习惯把投影仪看作一个“反向的相机”。你想想看,相机是把三维世界拍成二维图像,而投影仪是把二维图案投射到三维空间。这个思路,就是所谓的“逆相机模型”。
核心思想:投影仪可以建模为一个虚拟的相机,其成像过程与相机完全对称,只是光路方向相反。
3.1 投影仪逆相机模型
为什么说投影仪是“逆相机”?我们来拆解一下。
一个标准的相机模型,包含以下几步:
- 世界坐标系下的三维点 Pw
- 通过外参(旋转 R、平移 t)变换到相机坐标系 Pc
- 通过内参(焦距 fx, fy,主点 cx, cy)投影到像素坐标系 (u, v)
- 加上畸变(径向、切向)得到实际像素坐标
投影仪呢?它正好反过来:
- 我们有一个投影仪像素坐标 (up, vp)
- 通过投影仪内参,反算出它在投影仪坐标系下的方向
- 再通过投影仪外参,把这个方向变换到世界坐标系
说白了,投影仪就是一个“发射光线”的设备,而相机是“接收光线”的设备。数学上,它们共用同一套透视投影模型。
我的经验:我在做第一个结构光系统时,直接用了相机的标定代码去标投影仪,结果发现精度很差。后来才意识到,投影仪不能直接拍摄标定板,必须借助相机“看到”投影图案。这个坑,我替你们踩过了。
3.2 投影仪内参标定方法
投影仪不能自己“看”东西,那怎么标定它的内参呢?
常用的方法是“相机辅助标定法”。流程是这样的:
- 准备一个棋盘格标定板
- 投影仪向标定板投射编码图案(比如格雷码、相移条纹)
- 相机拍摄标定板上的投影图案
- 通过解码,得到投影仪像素坐标 (up, vp) 与标定板物理点之间的对应关系
- 把这些对应关系喂给张正友标定法,就能算出投影仪内参
这里的关键是:如何建立投影仪像素与标定板物理点的对应?
我常用的做法是:
- 投射水平和垂直的相移条纹,分别得到投影仪像素的 u 和 v 坐标
- 同时拍摄标定板,用角点检测得到标定板上的物理点坐标
- 两者结合,就得到了一组“虚拟的”投影仪-标定板对应点
代码实现上,核心步骤大致如下:
// 伪代码:投影仪内参标定
for each pose:
// 1. 投射并拍摄相移条纹
capture_phase_images();
// 2. 解相位,得到投影仪坐标
up = decode_horizontal_phase();
vp = decode_vertical_phase();
// 3. 检测标定板角点
board_points = detect_chessboard_corners();
// 4. 建立对应关系
correspondences.push_back({up, vp}, board_points);
// 5. 调用张正友标定
projector_intrinsics = calibrate(correspondences);
注意:投影仪的畸变通常比相机更严重,尤其是商用投影仪。我建议至少使用3阶径向畸变模型,否则重建出来的平面会明显弯曲。
3.3 结构光系统联合标定(相机-投影仪)
标定完相机和投影仪各自的内参后,下一步就是联合标定。说白了,就是求出相机和投影仪之间的相对位姿(旋转矩阵 R 和平移向量 t)。
联合标定的流程:
- 相机和投影仪同时观察同一个标定板
- 相机直接看到标定板角点,得到相机坐标系下的位姿
- 投影仪通过投射图案,“看到”标定板角点,得到投影仪坐标系下的位姿
- 利用两组位姿,求解相机-投影仪之间的 R 和 t
数学上,这是一个典型的手眼标定问题:
P_cam = R * P_proj + t
其中 Pcam 和 Pproj 是同一个物理点在相机坐标系和投影仪坐标系下的坐标。
我一般用最小二乘法来求解,采集10-15组不同位姿的数据,然后用 SVD 分解得到最优的 R 和 t。
避坑指南:我曾经遇到过联合标定后重建精度很差的情况,排查了很久才发现是标定板平面度不够。标定板一定要用陶瓷或玻璃基板,不要用纸打印的,热胀冷缩会引入很大误差。
3.4 标定精度评估
标定完了,怎么知道标得好不好?不能光看重投影误差,那个太理想化了。
我通常用以下几个指标:
| 指标 | 说明 | 我的经验阈值 |
|---|---|---|
| 重投影误差 | 标定板角点的重投影像素误差 | < 0.5 pixel |
| 平面拟合误差 | 重建一个平面,计算点到平面的距离 | < 0.1 mm |
| 球体拟合误差 | 重建一个标准球,计算球度误差 | < 0.2 mm |
| 重复性 | 多次标定,看内参和位姿的方差 | 焦距变化 < 0.5% |
我个人最看重的是平面拟合误差。为什么呢?因为结构光系统最常用的场景就是测量平面物体(比如电路板、玻璃面板)。如果连平面都重建不平,那其他复杂形状就更不用说了。
具体做法:
- 放一块高精度陶瓷平板在测量区域
- 用标定好的系统重建这个平面
- 用最小二乘法拟合一个理想平面
- 计算所有重建点到这个理想平面的距离
- 统计 RMS 和最大偏差
如果 RMS 超过 0.1 mm,我建议重新标定。嗯,这个标准可能有点严,但对于高精度工业检测来说,这是必须的。
总结一下:投影仪标定是结构光系统的“地基”。逆相机模型让我们能用相机标定的数学工具来处理投影仪;联合标定把相机和投影仪“对齐”到同一个坐标系;精度评估则告诉我们这个地基打得牢不牢。
好了,这一章就到这里。下一章我们会讲结构光编码策略——怎么设计投影图案,才能又快又准地重建三维信息。到时候见。