一、为什么要融合?
先看两个方法的本质:
格雷码(Gray Code)
优点:稳定、不易误码
缺点:只能整数精度(像素级)
输出:
相位移(Phase Shift)
优点:亚像素精度(0.01 pixel)
缺点:周期性 → 会"跳变"
输出:
相位不知道属于哪个周期(2π歧义)
二、核心思想(关键)
格雷码 → 确定周期编号
相位 → 确定周期内位置

工业流程
1 投影 Gray Code
2 投影 Phase Shift(3/4/5步相移)
方法 优点 3步 快 4步 抗噪好 5步 精度更高 3 相机采集
4 Gray 解码 → k
5 Phase 计算 → φ
6 相位展开 → Φ = 2πk + φ
7 三角测量 → 3D
三、相位移数学原理
以 **三步相移(3-step)**为例:
投影:

解相位
这是 包裹相位(wrapped phase)
相位展开
问题:
φ 是周期性的
例如:
真实: 7π
测量: π
用 Gray Code 解:
格雷码得到:
k = 周期编号
最终:
得到:
绝对相位(Absolute Phase)
四、空间坐标恢复
投影仪列坐标:
然后:
相机点 ↔ 投影仪点
做:
三角测量(Triangulation)
得到: XYZ
精度分析

工业优化
多步相移(推荐)
| 方法 | 优点 |
|---|---|
| 3步 | 快 |
| 4步 | 抗噪好 |
| 5步 | 精度更高 |
正反投影
pattern + inverse 提升鲁棒性
相位滤波
Gaussian / Median
阴影掩码
低亮度区域剔除
五、案例
相机分辨率:1280 × 1024
投影仪分辨率:1024 × 768
测量物体:金属台阶(有高度差)
目标:
恢复每个像素对应的 3D 坐标 (X,Y,Z)
投影阶段
投影 Gray Code
投影 10位格雷码(因为 1024=2¹⁰)
需要 10 张图(正码)
- 10 张图(反码)
= 20 张
投影相位移(Phase Shift)
分析单个点P
1、gray code 解码
假设该像素在 10 张 Gray 图中:
cpp
1 1 0 1 0 0 1 0 1 1
2、转换为二进制
cpp
Gray: 1 1 0 1 0 0 1 0 1 1
Binary:1 0 0 1 1 1 0 0 1 0
3、转十进制
k = 570 表示:该点属于第 570 条投影列(粗定位)
相位计算
该像素在4张相移图中的灰度:
I1 = 120
I2 = 200
I3 = 130
I4 = 60
计算相位

cpp
包裹相位:φ ∈ (-π, π]
相位展开(核心)
格雷码给出:
k = 570
绝对相位
投影仪坐标恢复
投影宽度: W = 1024
投影列坐标
投影列坐标 = 569.74 pixel(亚像素)
计算深度
相机内参

投影仪内参(当成"反向相机")
fx_p = 1000
fy_p = 1000
cx_p = 512
cy_p = 384
外参(投影仪相对于相机)
R = I(简化)
T = [100, 0, 0] mm
表示:
投影仪在相机右边 100 mm
已知观测(来自Gray+Phase)
相机看到:
u = 700
v = 500
投影仪对应:
xp = 569.74(亚像素)
yp = 400
像素 → 归一化坐标
相机光线方向

cpp
x_c = (700 - 640)/1200 = 0.05
y_c = (500 - 512)/1200 ≈ -0.01
相机光线:

投影仪光线

投影光线(在投影仪坐标系):

坐标统一到相机坐标系
投影仪位置:
C_p = (100, 0, 0)

求两条线最近点(核心)
理想情况:
两条线相交
实际:
求最小距离点

解方程
cpp
从:
-0.01t = 0.016s
→ s = -0.625t
代入 x 方程:
0.05t = 100 + 0.0577(-0.625t)
0.05t = 100 - 0.036t
0.086t = 100
t ≈ 1162.8
求3D坐标
最终结果
(X,Y,Z) ≈ (58.1, -11.6, 1162.8) mm
误差分析
相位误差
Gray错误(最危险)
如果:
k = 570 → 571
误差:
≈ 1 pixel
放大后:
严重误差(跳变)
