3. 投影仪模型与标定:逆相机模型、内参标定与联合标定

好,我们进入第三章。这一章讲的是投影仪的模型和标定。说实话,很多做结构光的朋友,一开始都把精力放在相机标定上,觉得投影仪嘛,就是个投光的工具。但真正做过系统的人都知道——投影仪才是整个系统的“灵魂”。它的精度,直接决定了三维重建的上限。

我个人习惯把投影仪看作一个“反向的相机”。你想想看,相机是把三维世界拍成二维图像,而投影仪是把二维图案投射到三维空间。这个思路,就是所谓的“逆相机模型”

核心思想:投影仪可以建模为一个虚拟的相机,其成像过程与相机完全对称,只是光路方向相反。

3.1 投影仪逆相机模型

为什么说投影仪是“逆相机”?我们来拆解一下。

一个标准的相机模型,包含以下几步:

  1. 世界坐标系下的三维点 Pw
  2. 通过外参(旋转 R、平移 t)变换到相机坐标系 Pc
  3. 通过内参(焦距 fx, fy,主点 cx, cy)投影到像素坐标系 (u, v)
  4. 加上畸变(径向、切向)得到实际像素坐标

投影仪呢?它正好反过来:

  1. 我们有一个投影仪像素坐标 (up, vp)
  2. 通过投影仪内参,反算出它在投影仪坐标系下的方向
  3. 再通过投影仪外参,把这个方向变换到世界坐标系

说白了,投影仪就是一个“发射光线”的设备,而相机是“接收光线”的设备。数学上,它们共用同一套透视投影模型。

我的经验:我在做第一个结构光系统时,直接用了相机的标定代码去标投影仪,结果发现精度很差。后来才意识到,投影仪不能直接拍摄标定板,必须借助相机“看到”投影图案。这个坑,我替你们踩过了。

3.2 投影仪内参标定方法

投影仪不能自己“看”东西,那怎么标定它的内参呢?

常用的方法是“相机辅助标定法”。流程是这样的:

  1. 准备一个棋盘格标定板
  2. 投影仪向标定板投射编码图案(比如格雷码、相移条纹)
  3. 相机拍摄标定板上的投影图案
  4. 通过解码,得到投影仪像素坐标 (up, vp) 与标定板物理点之间的对应关系
  5. 把这些对应关系喂给张正友标定法,就能算出投影仪内参

这里的关键是:如何建立投影仪像素与标定板物理点的对应?

我常用的做法是:

  • 投射水平和垂直的相移条纹,分别得到投影仪像素的 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)。

联合标定的流程:

  1. 相机和投影仪同时观察同一个标定板
  2. 相机直接看到标定板角点,得到相机坐标系下的位姿
  3. 投影仪通过投射图案,“看到”标定板角点,得到投影仪坐标系下的位姿
  4. 利用两组位姿,求解相机-投影仪之间的 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,我建议重新标定。嗯,这个标准可能有点严,但对于高精度工业检测来说,这是必须的。

总结一下:投影仪标定是结构光系统的“地基”。逆相机模型让我们能用相机标定的数学工具来处理投影仪;联合标定把相机和投影仪“对齐”到同一个坐标系;精度评估则告诉我们这个地基打得牢不牢。

好了,这一章就到这里。下一章我们会讲结构光编码策略——怎么设计投影图案,才能又快又准地重建三维信息。到时候见。


专注资料整理