3D-camera結構光原理算法
目前主流的深度探測技術是結構光,TOF,和雙目。具體的百度就有很詳細的信息。編程
而結構光也有雙目結構光和散斑結構光等,沒錯,Iphone X 的3D深度相機就用 散斑結構光。安全
我用結構光模塊作過實驗,主要考慮有效工做距離,精度和視場角是否知足需求。性能
本文對結構光(Structured Light)技術作一個比較全面的簡介。網站
結構光三維成像的硬件主要由相機和投射器組成,結構光就是經過投射器投射到被測物體表面的主動結構信息,如激光條紋、格雷碼、正弦條紋等;而後,經過單個或多個相機拍攝被測表面即得結構光圖像;最後,基於三角測量原理通過圖像三維解析計算從而實現三維重建。ui
利用紅外相機像素點信息求解被測物體深度信息須要通過:機構光解碼、像素、空間座標轉換;爲了知足獲取深度信息的實時性,結構光模塊內部通常會有一枚專用的處理芯片,用於計算並輸出實時信息。編碼
3D結構光目前的使用場景爲:spa
第一,物體信息分割與識別,3D人臉識別,用於安全驗證、金融支付等場景; 3d
第二,體感手勢識別,爲智能終端提供新的交互方式;code
第三,三維場景重建,利用深度相機生成的深度信息(點雲數據),結合RGB彩色圖像信息,可完成對三維場景的還原,可用於測距,虛擬裝修等場景。
基於結構光的三維成像,其實是三維參數的測量與重現,主要是區別於純粹的像雙目立體視覺之類的被動三維測量技術,於是被稱爲主動三維測量。由於他須要主動去投射結構光到被測物體上,經過結構光的變形(或者飛行時間等)來肯定被測物的尺寸參數,所以才叫作主動三維測量,嗯,至關主動。
首先,結構光的類型就分爲不少種,既然是結構光,固然是將光結構化,簡單的結構化包括點結構光,線結構光以及簡單的面結構光等。複雜一點的結構化就上升到光學圖案的編碼了。結構光投射到待測物表面後被待測物的高度調製,被調製的結構光經攝像系統採集,傳送至計算機內分析計算後可得出被測物的三維面形數據。其中調製方式可分爲時間調製與空間調製兩大類。時間調製方法中最經常使用的是飛行時間法,該方法記錄了光脈衝在空間的飛行時間,經過飛行時間解算待測物的面形信息;空間調製方法爲結構光場的相位、光強等性質被待測物的高度調製後都會產生變化,根據讀取這些性質的變化就可得出待測物的面形信息。
下面以一種應用普遍的光柵投影技術(條紋投影技術)爲例來闡述其具體原理。條紋投影技術實際上屬於廣義上的面結構光。其主要原理以下圖所示, 即經過計算機編程產生正弦條紋,將該正弦條紋經過投影設備投影至被測物,利用CCD相機拍攝條紋受物體調製的彎曲程度,解調該彎曲條紋獲得相位,再將相位轉化爲全場的高度。固然其中相當重要的一點就是系統的標定,包括系統幾何參數的標定和CCD相機以及投影設備的內部參數標定,不然極可能產生偏差或者偏差耦合。由於系統外部參數不標定則不可能由相位計算出正確的高度信息。
整體而言,結構光主要能夠分爲兩類
1. 線掃描結構光;
2. 面陣結構光。
通常說結構光的時候都指代第二類,這裏也主要關注面陣結構光。
1. 線掃描結構光
線掃描結構光較之面陣結構光較爲簡單,精度也比較高,在工業中普遍用於物體體積測量、三維成像等領域。
1.1 數學基礎
先來看一個簡單的二維下的狀況:
經過上圖能夠看到線掃描結構光裝置的一個基本結構。主動光源L緩慢掃過待測物體,在此過程當中,相機記錄對應的掃描過程,最後,依據相機和光源在該過程當中的相對位姿和相機內參等參數,就能夠重建出待測物體的三維結構。
由上圖可知:
可得
其中, α 爲投影裝置的朝向。 β 則須要經過對應像素的像素座標 μ和焦距f來肯定。最終可知P點的三維座標爲:
將之推廣至三維空間中
:
由小孔成像模型有
由三角測量原理又有
兩式聯立則有
最後可得
能夠看到,三維空間中的情形和以前的二維空間相似,做爲俯仰角的 γ並無出如今公式中。
1.2 應用
如上圖,相機與投影器等相對位姿都通過了精確的校訂,而且選取了測量臺上的一角做爲原點創建物方座標系。所以,激光投影器所投射的線激光在物方座標系中能夠經過一個平面方程來描述:
而相機光心的位姿經過幾何校訂也已知,能夠經過找到線激光在圖像中的對應像素重建出光心與像素的射線,射線和激光平面的交點即爲待求的三維空間點。由小孔成像模型有
代入平面方程中,可得
2. 面陣結構光
面陣結構光大體能夠分爲兩類:隨機結構光和編碼結構光。隨機結構光較爲簡單,也更加經常使用。經過投影器向被測空間中投射亮度不均和隨機分佈的點狀結構光,經過雙目相機成像,所得的雙目影像通過極線校訂後再進行雙目稠密匹配,便可重建出對應的深度圖。以下圖爲某種面陣的紅外結構光。
隨機結構光這裏就再也不說了,由於和普通雙目算法是很類似的。一些額外的考慮就是是否給相機加裝濾光片、光斑的密度要到什麼程度等硬件和光學的問題了。這裏主要討論編碼結構光。編碼結構光能夠分爲兩類:
1. 時序編碼;
2. 空間編碼。
2.1 時序編碼
如上圖,時序編碼結構光即爲在必定時間範圍內,經過投影器向被測空間投射一系列明暗不一樣的結構光,每次投影都經過相機進行成像。假設共有n張影像,並設被陰影覆蓋的部分編碼值爲1,未被覆蓋的部分編碼值爲0。此時,每一個像素都對應惟一一個長度爲n的二進制編碼,雙目影像搜索匹配像素的問題就變成了查找具備相同編碼值的像素。若是雙目圖像已經進行了極線校訂,那麼所投影的結構光只須要在x方向上不具備重複性便可。
如上圖中,紅框內的像素的編碼爲0110,轉化爲十進制則爲5。此時,只須要在右圖相同行上檢索編碼值爲5的像素便可。上圖編碼方式稱爲二進制碼(binary code),每段區域不斷的進行二分下去直至投影的編碼寬度等於相機的像素寬度便可。對於寬度爲1024的圖像,最少須要10張影像來進行編碼。
Binary Code 的一種改進爲Gray Code. Gray Code比Binary Code具備更好的魯棒性,它使得相鄰兩個像素相差1bit。Gray Code的詳細介紹和其與Binary Code之間的轉換能夠參考wikipedia。
注意觀察便可看到gray code和binary code在前幾行像素上的不一樣
轉換算法:
天然,除了使用二進制的0-1編碼以外,還可使用更多顏色層級的編碼。假設使用了M種不一樣的灰度層級進行編碼,則拍攝N張影像能夠獲得包含
個條帶的影響。以下圖中M = 3, N = 3時圖中有27條條帶。
由以上的介紹也能夠得出時序編碼結構光的優缺點:優勢:
· 高精度;
缺點:
· 只適用於靜態場景;
· 須要拍攝大量影像。
2.2 空間編碼
爲知足動態場景的須要,能夠採用空間編碼結構光。前面談到了隨機結構光,就是不帶編碼信息,投影隨機紋理,而這裏討論的空間編碼結構光特指向被測空間中投影通過數學編碼的、必定範圍內的光斑不具有重複性的結構光。由此,某個點的編碼值能夠經過其臨域得到。其中,包含一個完整的空間編碼的像素數量(窗口大小)就決定了重建的精度。
2.2.1 德布魯因序列 (De Bruijn) 序列
德布魯因序列(維基百科)B(k, n) 表示用k個符號(如二進制,k = 2)來表示長度爲
的循環編碼,n爲一個編碼值的長度。舉例:最簡單的,k = 2時,採用二進制符號(0, 1),編碼值的長度n = 2,能夠獲得一個長度爲
的循環序列:[0, 0, 1, 1]。此時,咱們獲得4個長度爲2的不一樣的編碼:[0, 0], [0, 1], [1, 1], [1, 0].所以,某種結構光就能夠按照該德布魯因序列進行編碼。而得到的結構光影像中,以上4個像素的編碼爲[0, 0, 1, 1],經過一個大小爲2的滑動窗口(假定一個結構光光斑或光束的寬度是一個像素)便可獲取每一個像素的編碼值。一樣地,若是是通過極線校訂的雙目圖像,只須要搜索對應的行便可,此時只要求編碼在x軸上不具有重複性。此時的結構光就是豎直條帶狀的。固然,爲了提升編碼效率,也可使用灰度圖、彩色圖像等比0-1編碼具備更多可能編碼值的投影方式。例如,對於RGB影像,採用二進制編碼(即某種顏色只有 有、無 兩種狀態),則共有
種顏色組合,去除(0, 0, 0),還剩下7種顏色。所以k = 7, n = 3,這樣就能夠得到一個長度爲343的條帶序列。對於這個序列,惟一的約束爲:相鄰的條帶不能爲一樣的顏色。不然對於解碼算法來講很容易形成偏差。下圖展現了只使用5種顏色(k = 5, n = 3)的結構光序列:
2.2.2 二維空間編碼
德布魯因序列是一種一維編碼,能夠將之擴展到二維空間中,使得對於一個x * y大小的二維空間,其中一個w * h大小的子窗口所包含的編碼值在這整個二維編碼序列中只出現一次。
如上面中的4 * 6的M-arrays序列中,每一個2 * 2大小的窗口所包含的編碼值都是惟一的。一樣也能夠利用RGB信息來進行二維編碼,有相關算法來產生一些僞隨機二維編碼。如在下圖中,左邊展現了一個6 * 6大小的二維矩陣,子窗口的大小爲3 * 3。算法首先在左上角的3 * 3子窗口中隨機填入各類顏色;而後一個3 * 1大小的滑動窗口移動到右端第一個空白處,並隨機填入3中顏色;在填入生成的隨機顏色前,算法會先驗證子窗口的編碼的惟一性能不能獲得保證,若不能,則會從新生成3中隨機顏色;如此循環,只是在豎直方向上滑動窗口的大小變爲1 * 3,直至將整個6 * 6矩陣填滿。右圖則是該算法產生的某種僞隨機二維編碼的示例。
經過以上對空間編碼的討論,也能夠看出空間編碼結構光的一些優缺點:優勢:
· 無需多張照片,只須要一對影像便可進行三維重建。能夠知足實時處理,用在動態環境中。
缺點
· 易受噪聲干擾:因爲反光、照明等緣由可能致使成像時部分區域等編碼信息缺失;
· 對於空間中的遮擋比較敏感;
· 相較於時序編碼結構光精度較低。
以上是對各類經常使用的結構光技術的一些介紹。其實,三維重建中最經常使用的仍是隨機面陣結構光。經過向空間中投影這樣的隨機結構光,再結合雙目稠密重建,能夠得到比單純使用RGB影像進行三維重建更加可靠和精確的結果。最後,向對結構光和三維重建感興趣的同窗推薦一個項目:build your own 3D scanner。和名字同樣,網站上提供了本身使用觸手可及和低成本的設備來DIY一個3D掃描儀所需的一切,包括教程、ppt、代碼、數據和其餘人的做品展現,感興趣的同窗歡迎動手嘗試。