1. 基本原理概述
结构光三维重建(Structured Light 3D Reconstruction)是一种主动式光学测量方法。其核心思想是:
- 向物体表面投射一组 已知的、编码好的光栅/条纹图案;
- 使用一个或多个摄像机拍摄这些条纹在物体表面的变形情况;
- 根据条纹变形推算物体表面点的空间三维坐标。
结构光的本质是 将三维重建问题转化为已知投影模式与变形观测之间的几何约束问题。
2. 系统组成
一个完整的结构光三维重建系统通常由 硬件部分 和 软件部分 共同构成。硬件负责信号的产生与采集,软件负责数据处理与三维重建。
2.1 投影模块
投影模块的作用是 将已知的结构光编码图案投射到被测物体表面。它通常由以下几部分构成:
-
投影器(Projector)
-
类似微型投影仪(DLP、LCD、LCOS 技术常见),可以精确控制每个像素的光强。
-
要求:
- 高分辨率(保证投影条纹精细度)。
- 高对比度(保证条纹边界清晰,便于后续解码)。
- 稳定光源(避免闪烁造成相机曝光差异)。
-
-
投影图案(Patterns)
-
根据编码方式的不同,投影的图案可能是:
- 二值条纹、Gray 编码、彩色编码。
- 正弦相移条纹。
- 随机散斑。
-
投影图案的选择直接决定了 解码方式 和 测量精度。
-
一般投影仪与相机需固定在刚性支架上,保证几何关系稳定。
-
2.2 成像模块(相机)
成像模块的任务是 采集被投影图案调制后的物体表面图像。
关键要点:
-
相机类型
- 工业相机、单反相机或高速相机。
- 彩色相机可直接解码彩色结构光,黑白相机常配合多帧灰度图案。
-
成像质量要求
- 高分辨率(保证三角测量点的稠密性)。
- 高帧率(保证动态物体测量)。
- 低畸变镜头(减少几何误差)。
- 良好的信噪比(避免光强抖动影响条纹识别)。
-
几何参数
- 相机的 内参(焦距、主点、畸变系数)和 外参(相机与投影仪之间的相对位姿)是三角测量计算三维点的关键。
2.3 控制与同步模块
结构光测量需要 投影与拍摄严格同步,否则条纹会错位,导致解码失败。
-
触发机制
- 硬件触发:由控制电路统一触发相机和投影仪。
- 软件触发:通过高精度时钟协调,但误差较大。
-
同步方式
- 帧同步:相机在投影仪更新一幅图案时准确曝光。
- 多机同步:若采用多相机测量,必须保证它们在同一时刻采集数据。
2.4 数据处理模块(软件部分)
这是系统的核心,主要包括以下几个步骤:
-
图案解码
-
根据投影方式提取相机图像中的条纹信息。
-
示例:
- Gray 编码:逐位解码条纹编号。
- 相移法:通过多幅相移正弦图案,计算相位分布。
-
-
匹配与相位展开
- 将相机中每个像素与投影图案中的像素位置对应起来。
- 相移法还需解决“相位模糊(2π周期性)”,常用相位展开算法。
-
三角测量
-
根据相机与投影仪的几何模型,利用三角测量公式计算三维点坐标:
Z=f⋅Bd Z = \frac{f \cdot B}{d} Z=df⋅B
其中 fff 为相机焦距,BBB 为基线长度,ddd 为视差。
-
-
点云生成与优化
- 将所有像素解算得到的三维点集合形成点云。
- 对点云进行去噪、滤波、重采样,提高表面质量。
-
后处理
- 点云拼接(多视角融合)。
- 表面重建(Poisson 重建、Delaunay 三角化等)。
- 纹理映射。
2.5 校准模块
投影仪和相机的几何关系是三维重建的基础,必须通过 系统校准 获取。
- 相机标定:求取内参(焦距、主点、畸变系数)。
- 投影仪标定:把投影仪当作“反向相机”,通过投影标定板图案进行标定。
- 系统标定:得到相机与投影仪的外参(旋转矩阵和平移向量)。
只有完成标定,三角测量才能保证三维重建的精度。
3. 数学原理与推导
3.1 三角测量原理(详细推导与数值实现)
3.1.1 基本模型(相机 / 投影仪 都按针孔模型)
- 相机内参:KcK_cKc。投影仪内参:KpK_pKp(把 projector 当“反向相机”建模)。
- 相机坐标系到投影仪坐标系的外参:旋转 RRR、平移 ttt(将投影仪坐标变换到相机坐标:xc=Rxp+t\mathbf{x}_c = R\mathbf{x}_p + txc=Rxp+t)。
- 相机像素 uc=[uc,vc,1]⊤\mathbf{u}_c=[u_c,v_c,1]^\topuc=[uc,vc,1]⊤,投影仪像素/投影坐标 up=[up,vp,1]⊤\mathbf{u}_p=[u_p,v_p,1]^\topup=[up,vp,1]⊤。
针孔投影给出射线方向(未缩放):
dc∝Kc−1uc,dp∝Kp−1up. \mathbf{d}_c \propto K_c^{-1}\mathbf{u}_c,\qquad \mathbf{d}_p \propto K_p^{-1}\mathbf{u}_p. dc∝Kc−1uc,dp∝Kp−1up.
令 dc,dp\mathbf{d}_c,\mathbf{d}_pdc,dp 都归一化(或不归一化也可,但后续公式需一致)。
空间约束(理想无噪声):某个三维点在相机系的坐标可以写成沿相机射线的参数化:
Xc=λcdc, \mathbf{X}_c = \lambda_c \mathbf{d}_c, Xc=λcdc,
在投影仪系中为
Xp=λpdp, \mathbf{X}_p = \lambda_p \mathbf{d}_p, Xp=λpdp,
二者由外参联系:
λcdc=R(λpdp)+t. \lambda_c \mathbf{d}_c = R(\lambda_p \mathbf{d}_p) + t. λcdc=R(λpdp)+t.
这是三维向量方程(3 个标量方程),未知为两个尺度因子 λc,λp\lambda_c,\lambda_pλc,λp。
3.1.2 解析求解(最小二乘 / 最近点法)
把上式重写为线性系统(矩阵形式):
A[λcλp]=t,A=[ dc , −Rdp ](3×2). A \begin{bmatrix}\lambda_c\\ \lambda_p\end{bmatrix} = t,\quad A = \big[\,\mathbf{d}_c \;,\; -R\mathbf{d}_p\,\big]\quad(3\times2). A[λcλp]=t,A=[dc,−Rdp](3×2).
这是一个过约束的线性系统(3 eq, 2 unknowns),在存在噪声时用最小二乘求解:
[λcλp]=(A⊤A)−1A⊤t. \begin{bmatrix}\lambda_c\\ \lambda_p\end{bmatrix} = (A^\top A)^{-1} A^\top t. [λcλp]=(A⊤A)−1A⊤t.
得到 λc\lambda_cλc 后,三维点取为 Xc=λcdc\mathbf{X}_c=\lambda_c \mathbf{d}_cXc=λcdc。由于两条射线通常不严格相交(噪声、标定误差),更稳健的做法是计算两条最近点并取中点:
设两条线 L1:p1+sv1L_1: \mathbf{p}_1 + s\mathbf{v}_1L1:p1+sv1(摄像机中心 p1\mathbf{p}_1p1,方向 v1=dc\mathbf{v}_1=\mathbf{d}_cv1=dc), L2:p2+tv2L_2: \mathbf{p}_2 + t\mathbf{v}_2L2:p2+tv2(投影仪中心 p2=t\mathbf{p}_2=tp2=t 在相机系,方向 v2=Rdp\mathbf{v}_2 = R\mathbf{d}_pv2=Rdp)。求使距离最小的参数 s,ts,ts,t:
令 w=p1−p2\mathbf{w}=\mathbf{p}_1-\mathbf{p}_2w=p1−p2,则求解线性系统(见推导):
[v1⋅v1−v1⋅v2v1⋅v2−v2⋅v2][st]=[v1⋅wv2⋅w]. \begin{bmatrix} \mathbf{v}_1\cdot\mathbf{v}_1 & -\mathbf{v}_1\cdot\mathbf{v}_2\\[2pt] \mathbf{v}_1\cdot\mathbf{v}_2 & -\mathbf{v}_2\cdot\mathbf{v}_2 \end{bmatrix} \begin{bmatrix}s\\ t\end{bmatrix} =\begin{bmatrix} \mathbf{v}_1\cdot\mathbf{w}\\[2pt] \mathbf{v}_2\cdot\mathbf{w} \end{bmatrix}. [v1⋅v1v1⋅v2−v1⋅v2−v2⋅v2][st]=[v1⋅wv2⋅w].
求出 s,ts,ts,t,对应最近点 P1=p1+sv1\mathbf{P}_1=\mathbf{p}_1+s\mathbf{v}_1P1=p1+sv1,P2=p2+tv2\mathbf{P}_2=\mathbf{p}_2+t\mathbf{v}_2P2=p2+tv2,最后取 (P1+P2)/2(\mathbf{P}_1+\mathbf{P}_2)/2(P1+P2)/2 作为估计点。
推荐数值实现:用小矩阵解方程(2×2)或 SVD/QR 保证稳定性;当两条射线接近共面/共线时矩阵条件数恶化,需特殊处理(丢弃或标记为不可靠)。
3.1.3 特殊简化:标定已做且已矩形化(rectified) — “视差”公式
若系统做成与传统立体视觉类似(基线平行于像平面 x 轴,视差 d=uc−upd=u_c-u_pd=uc−up),有经典深度公式:
Z=fBd, Z = \frac{f B}{d}, Z=dfB,
其中 fff 是(等效)焦距(像素),BBB 是相机-投影仪基线(米),ddd 是视差(像素)。这个公式便于快速估计误差传播。
3.1.4 误差传播(深度对视差的敏感度)
对视差误差 σd\sigma_dσd 的一阶近似:
σZ≈∣∂Z∂d∣σd=fBd2σd. \sigma_Z \approx \left|\frac{\partial Z}{\partial d}\right|\sigma_d = \frac{fB}{d^2}\sigma_d. σZ≈∂d∂Zσd=d2fBσd.
举例:f=1000f=1000f=1000 px, B=0.1B=0.1B=0.1 m, d=20d=20d=20 px, σd=0.1\sigma_d=0.1σd=0.1 px,则
σZ=1000×0.1202×0.1=100400×0.1=0.25×0.1=0.025 m=25 mm. \sigma_Z = \frac{1000\times 0.1}{20^2}\times 0.1 = \frac{100}{400}\times 0.1 = 0.25\times 0.1 = 0.025\ \text{m} =25\ \text{mm}. σZ=2021000×0.1×0.1=400100×0.1=0.25×0.1=0.025 m=25 mm.
说明:视差小(远景)时深度误差会迅速变大;提高基线 BBB、焦距 fff、或减小视差噪声(提升亚像素精度)可以降低深度不确定性。
3.2 图案编码与相位解码
结构光的目标是为每个相机像素找到对应投影仪像素。实现这一步通常用“编码(coarse) + 相位(fine)”的混合策略,以兼顾绝对值(哪一条条纹)和亚像素精度。
3.2.1 格雷码(Gray code)——获得绝对条纹序号(粗匹配)
- 思路:在投影器上按列(或行)投射一系列二值条纹位平面,每个位平面代表二进制的一个位(从高位到低位)。相机记录每帧,可靠地判断 0/1 后就能恢复每个投影器列的二进制编号(经过 Gray->binary 转换)。
- Gray code 的优点:相邻列只有 1 位不同,减小边缘抖动导致多位错误的概率。
- 缺点:分辨率受限于投影器像素间隔(只能得到整像素级对应);对遮挡/阴影敏感(那些像素无法解码)。
工程实践:常把 Gray code 得到的“整数列索引”当作相位解包(unwrap)时的粗索引(fringe order),与相移相位结合得到绝对亚像素位置。
3.2.2 相移法(Phase-shifting)——获得亚像素精度(细匹配)
模型(N 步相移)
投影正弦条纹(例如沿 x 方向),第 kkk 帧投影相移 δk\delta_kδk。相机在像素 (x,y)(x,y)(x,y) 记录强度:
Ik(x,y)=Ia(x,y)+Im(x,y)cos(ϕ(x,y)+δk)+nk, I_k(x,y) = I_a(x,y) + I_m(x,y)\cos(\phi(x,y) + \delta_k) + n_k, Ik(x,y)=Ia(x,y)+Im(x,y)cos(ϕ(x,y)+δk)+nk,
- IaI_aIa 背景平均亮度;ImI_mIm 调制幅度(对比度);ϕ(x,y)\phi(x,y)ϕ(x,y) 为该像素的相位(与投影器坐标线性相关);nkn_knk 为噪声。
- 典型 δk=2πkN\delta_k = \frac{2\pi k}{N}δk=N2πk(等间隔),常用 N=3,4,5…N=3,4,5\ldotsN=3,4,5…。
相位解法(通用 N 步公式)
定义:
C=∑k=0N−1Ikcosδk,S=∑k=0N−1Iksinδk. C = \sum_{k=0}^{N-1} I_k \cos\delta_k,\qquad S = \sum_{k=0}^{N-1} I_k \sin\delta_k. C=k=0∑N−1Ikcosδk,S=k=0∑N−1Iksinδk.
那么**包装相位(wrapped phase)**由
ϕwrap=atan2(S,C) \phi_{\text{wrap}} = \operatorname{atan2}(S, C) ϕwrap=atan2(S,C)
得到,范围 (−π,π](-\pi, \pi](−π,π](或 [0,2π)[0,2\pi)[0,2π) 视实现)。
特殊常见公式(N=3,δ∈{0,2π/3,4π/3}\delta\in\{0,2\pi/3,4\pi/3\}δ∈{0,2π/3,4π/3}):
ϕ=arctan3(I1−I3)2I2−I1−I3. \phi = \arctan\frac{\sqrt{3}(I_1 - I_3)}{2I_2 - I_1 - I_3}. ϕ=arctan2I2−I1−I33(I1−I3).
同时可以估计平均亮度与幅度:
Ia=1N∑kIk,Im≈2NC2+S2. I_a = \frac{1}{N}\sum_k I_k,\qquad I_m \approx \frac{2}{N}\sqrt{C^2+S^2}. Ia=N1k∑Ik,Im≈N2C2+S2.
包装相位(wrapped)与绝对相位(unwrapped)
- ϕwrap\phi_{\text{wrap}}ϕwrap 只给出模 2π2\pi2π 的相位信息(即在每个周期内部);要得到与投影器全局坐标对应的绝对相位,需要**相位展开(phase unwrapping)**或用 Gray code 给出粗索引。
- 常用做法:先用 Gray code 得到每像素对应的“周期编号 mmm”(整数),再合成:
Φabs(x,y)=ϕwrap(x,y)+2πm(x,y). \Phi_{\text{abs}}(x,y) = \phi_{\text{wrap}}(x,y) + 2\pi m(x,y). Φabs(x,y)=ϕwrap(x,y)+2πm(x,y).
再将绝对相位映射到投影仪像素坐标(见 3.3)。
相位展开算法(二维)
- 路径(质量)引导型:根据每像素的“相位质量”(比如幅值 ImI_mIm)从高质量像素开始逐步展开,避免传播错误(Goldstein 等方法)。
- 区域生长/边界跟踪:从可靠区扩散到不可靠区。
- 多频/多步时域方法(见下)也经常用于获得绝对相位,减少空间展开需求。
多频/多波长相移(temporal/multi-frequency)
当单频相位周期重复很多次(高频),展开困难且对噪声敏感。采用两组(或多组)不同频率 f1,f2f_1,f_2f1,f2 的相移,分别测得被包装的相位 ϕ1,ϕ2\phi_1,\phi_2ϕ1,ϕ2,利用两者的“差频”产生更长的合成波长,从而实现 粗到细 的无歧义解包(相当于用中国剩余定理思想):
如果理论上 ϕi=2πfixp ( mod 2π)\phi_i = 2\pi f_i x_p \ (\bmod\ 2\pi)ϕi=2πfixp (mod 2π),则目标是求出整数 kkk 使得:
xp=ϕ1+2πk2πf1 x_p = \frac{\phi_1 + 2\pi k}{2\pi f_1} xp=2πf1ϕ1+2πk
与 (ϕ2+2πm)/(2πf2)(\phi_2 + 2\pi m)/(2\pi f_2)(ϕ2+2πm)/(2πf2) 一致,从而可解出 k,mk,mk,m。实际常用近似整数估计公式(工程实现采用最近整数量化以容忍噪声)。
噪声与 SNR(相位精度)
相位测量的方差与调制幅度、测量噪声、步数 N 有关。近似关系(简化形式):
σϕ2≈2NσI2Im2, \sigma_\phi^2 \approx \frac{2}{N} \frac{\sigma_I^2}{I_m^2}, σϕ2≈N2Im2σI2,
其中 σI2\sigma_I^2σI2 是强度测量噪声的方差。结论:增大 N(更多相移帧)、提高调制幅度 ImI_mIm 或降低噪声都会降低相位误差。
3.2.3 Gray code + 相移的混合策略(常用)
- 先投 Gray code 得整数周期编号(鲁棒识别大致位置,抗噪/误码);
- 再投 N 步相移条纹以获得包装相位(亚像素);
- 最后合成绝对相位映射到投影器像素坐标。这种混合方法兼顾了鲁棒性(整像素)与精度(亚像素)。
3.2.4 工程细节与抗干扰
- 环境光与伽玛校正:投影亮度经过屏幕/被测物反射并被相机感知,必须做伽玛补偿或辐射度校正(线性化)以保证正弦模型成立。
- 曝光与增益自适应:不同区域反射差异极大时,采用多曝光或曝光自适应(局部)以保持足够 ImI_mIm。
- 漂白/饱和检测:检测饱和像素并在重建中剔除或用插值填补。
- 遮挡/阴影的处理:利用多摄像头或多角度投影,或在 Gray code 解码时标记无法解码的像素并在后处理插值。
- 镜面/透明材质:对于强镜面反射或半透明材质,结构光直接重建困难,通常需要涂抹消光剂或采用偏振/多光谱方法。
3.3 从相位/像素到三维的完整映射
在有了相机像素位置 uc\mathbf{u}_cuc 和对应的 投影器坐标(可以是连续的亚像素)up\mathbf{u}_pup(或投影器列坐标 xpx_pxp) 后,按 3.1 的三角化方法恢复三维点。
3.3.1 相位到投影器像素坐标的映射(重要公式)
假设在投影器水平方向上投射 NxN_xNx 个周期(周期数可以为 1 以上),投影器宽度为 WpW_pWp(像素或归一化单位)。投影上单次正弦周期产生的相位与投影器坐标关系:
ϕ=2π⋅NxWp⋅xp( mod 2π). \phi = 2\pi \cdot \frac{N_x}{W_p}\cdot x_p \quad (\bmod 2\pi). ϕ=2π⋅WpNx⋅xp(mod2π).
因此绝对相位(已解包)与投影器坐标的关系:
xp=Φabs2π⋅WpNx. x_p = \frac{\Phi_{\text{abs}}}{2\pi}\cdot\frac{W_p}{N_x}. xp=2πΦabs⋅NxWp.
更通俗一点:一个完整的 2π2\pi2π 相位对应 Wp/NxW_p/N_xWp/Nx 个像素(即一个周期宽度)。如果你用 Gray code 得到周期编号 mmm,完整表达式为:
xp=(ϕwrap2π+m)⋅WpNx. x_p = \left(\frac{\phi_{\text{wrap}}}{2\pi} + m\right)\cdot\frac{W_p}{N_x}. xp=(2πϕwrap+m)⋅NxWp.
如果投影图案在垂直方向也编码 vpv_pvp,对应类似处理。
3.3.2 把投影器像素转换为投影光线方向
投影器像素 [up,vp,1]⊤[u_p,v_p,1]^\top[up,vp,1]⊤ → 未归一化射线方向:
dp=Kp−1up. \mathbf{d}_p = K_p^{-1}\mathbf{u}_p. dp=Kp−1up.
(若投影器像素是连续的亚像素值也成立)。在计算时建议把 dp\mathbf{d}_pdp 归一化以减小数值问题。
3.3.3 三角化(把 3.1 的公式工程化)
-
预先在初始化/标定时计算投影器中心在相机系的位置 ttt 与方向旋转 RRR。
-
对每个像素 uc\mathbf{u}_cuc:
- 从相位和 Gray code 得到投影器像素 up\mathbf{u}_pup。
- 计算 dc=Kc−1uc\mathbf{d}_c = K_c^{-1}\mathbf{u}_cdc=Kc−1uc,dp=Kp−1up\mathbf{d}_p = K_p^{-1}\mathbf{u}_pdp=Kp−1up。
- 在相机系中令 v1=dc, p1=0\mathbf{v}_1=\mathbf{d}_c,\ \mathbf{p}_1=\mathbf{0}v1=dc, p1=0(摄像机中心),v2=Rdp, p2=t\mathbf{v}_2 = R\mathbf{d}_p,\ \mathbf{p}_2 = tv2=Rdp, p2=t(投影仪中心在相机系)。
- 求解最短连线参数 s,ts,ts,t(见 3.1.2 的 2×2 线性系统),取两线最近点中点为 Xc\mathbf{X}_cXc。
- 可额外做基于相位/强度的置信度过滤:如果 ImI_mIm 很小或 Gray 解码失败则标记为 invalid。
伪代码要点(矢量化实现更快):
for each camera pixel u_c:
u_p = phase_to_projector_pixel(phi_wrap(u_c), gray_index(u_c))
d_c = Kc^{-1} * u_c; normalize
d_p = Kp^{-1} * u_p; normalize
v1 = d_c; p1 = [0,0,0]
v2 = R * d_p; p2 = t
solve 2x2 for s,t
P1 = p1 + s*v1; P2 = p2 + t*v2
X = (P1 + P2)/2
store X if confidence OK
3.3.4 亚像素精化与回投校正
- 得到初始三维点后可以把点回投到投影器与相机图像上,计算重投影误差并用小范围非线性优化(例如对 Φabs\Phi_{\text{abs}}Φabs 做亚像素校正,或对 X\mathbf{X}X 做 Levenberg–Marquardt 微调)来改善精度。
- 在高精度应用(亚毫米 / 工业检测)常见做法:先粗重建,再在局部窗口对相位做横向/纵向相位剖面拟合或用互相关(NCC)做亚像素匹配以获得更稳定的视差。
3.3.5 相位误差如何转化为深度误差(组合公式)
- 相位误差 δϕ\delta\phiδϕ 导致投影像素误差:
δxp=Wp2πNx δϕ. \delta x_p = \frac{W_p}{2\pi N_x}\,\delta\phi. δxp=2πNxWpδϕ.
- 该像素误差转为视差误差(若系统已矩形化或把 δxp\delta x_pδxp 等同于视差 δd\delta dδd)后,深度误差近似为:
δZ≈fBd2 δd(或把 δd=δxp 代入). \delta Z \approx \frac{f B}{d^2}\,\delta d \quad\text{(或把 }\delta d=\delta x_p\text{ 代入)}. δZ≈d2fBδd(或把 δd=δxp 代入).
组合:
δZ≈fBd2⋅Wp2πNx δϕ. \delta Z \approx \frac{fB}{d^2}\cdot \frac{W_p}{2\pi N_x}\,\delta\phi. δZ≈d2fB⋅2πNxWpδϕ.
从这个式子可以看出:相位噪声在高频(大 NxN_xNx)时在投影像素空间映射较小,但通过视差转换到深度仍可能放大 —— 存在 trade-off:更密的条纹提升相位分辨率但会使绝对相位解包更困难且对噪声更敏感。实际工程上常用多频混合(低频确定全局、 高频给出细节)来平衡。
在结构光三维重建中,相机和投影仪的几何参数直接决定了三角测量的精度。
标定(Calibration)的目标是 确定相机与投影仪的成像模型及它们之间的空间关系,为后续的三维点计算提供可靠依据。