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?1?uc?,dp?∝Kp?1?up?.
令 dc,dp\mathbf{d}_c,\mathbf{d}_pdc?,dp? 都歸一化(或不歸一化也可,但后續公式需一致)。
空間約束(理想無噪聲):某個三維點在相機系的坐標可以寫成沿相機射線的參數化:
Xc=λcdc, \mathbf{X}_c = \lambda_c \mathbf{d}_c, Xc?=λc?dc?,
在投影儀系中為
Xp=λpdp, \mathbf{X}_p = \lambda_p \mathbf{d}_p, Xp?=λp?dp?,
二者由外參聯系:
λcdc=R(λpdp)+t. \lambda_c \mathbf{d}_c = R(\lambda_p \mathbf{d}_p) + t. λc?dc?=R(λp?dp?)+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?=λc?dc?。由于兩條射線通常不嚴格相交(噪聲、標定誤差),更穩健的做法是計算兩條最近點并取中點:
設兩條線 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??v1?v1??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?1?Ik?cosδk?,S=k=0∑N?1?Ik?sinδ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}):
?=arctan?3(I1?I3)2I2?I1?I3. \phi = \arctan\frac{\sqrt{3}(I_1 - I_3)}{2I_2 - I_1 - I_3}. ?=arctan2I2??I1??I3?3?(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?=N1?k∑?Ik?,Im?≈N2?C2+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πfi?xp??(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?≈N2?Im2?σ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π?Wp?Nx???xp?(mod2π).
因此絕對相位(已解包)與投影器坐標的關系:
xp=Φabs2π?WpNx. x_p = \frac{\Phi_{\text{abs}}}{2\pi}\cdot\frac{W_p}{N_x}. xp?=2πΦabs???Nx?Wp??.
更通俗一點:一個完整的 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)?Nx?Wp??.
如果投影圖案在垂直方向也編碼 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?1?up?.
(若投影器像素是連續的亞像素值也成立)。在計算時建議把 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?1?uc?,dp=Kp?1up\mathbf{d}_p = K_p^{-1}\mathbf{u}_pdp?=Kp?1?up?。
- 在相機系中令 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; normalized_p = Kp^{-1} * u_p; normalizev1 = d_c; p1 = [0,0,0]v2 = R * d_p; p2 = tsolve 2x2 for s,tP1 = p1 + s*v1; P2 = p2 + t*v2X = (P1 + P2)/2store 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πNx?Wp??δ?.
- 該像素誤差轉為視差誤差(若系統已矩形化或把 δ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πNx?Wp??δ?.
從這個式子可以看出:相位噪聲在高頻(大 NxN_xNx?)時在投影像素空間映射較小,但通過視差轉換到深度仍可能放大 —— 存在 trade-off:更密的條紋提升相位分辨率但會使絕對相位解包更困難且對噪聲更敏感。實際工程上常用多頻混合(低頻確定全局、 高頻給出細節)來平衡。
在結構光三維重建中,相機和投影儀的幾何參數直接決定了三角測量的精度。
標定(Calibration)的目標是 確定相機與投影儀的成像模型及它們之間的空間關系,為后續的三維點計算提供可靠依據。