點擊上方「3D視覺工坊」,選擇「星標」git
乾貨第一時間送達github
光學和算法是3D結構光的核心能力,性能優越的3D結構光攝像頭必須是光學系統和深度算法的完美融合,二者高度耦合且技術上不可分割。算法
本篇文章分爲兩個章節:第一章前言回顧3D成像(雙目、主動式雙目、結構光)的發展歷史與淵源;第二章重點介紹主動式雙目系統與散斑結構光系統的算法細節與難點挑戰。微信
第一章框架
前言函數
雙目成像技術自誕生以來,經歷了半個多世紀的發展。最初的雙目成像系統源自於對人眼雙目的仿生:性能
圖1 雙目成像系統示意圖 [11]學習
經過上圖能夠明顯看出,物體的空間位置移動(尤爲是光軸方向的先後移動)會帶來左右視圖上投影點的像素位移,按照上圖中的三角原理,Z軸移動量的大小能夠經過投影點的像素位移來衡量,順着這個思路,行業內發展出了雙目立體匹配技術,就是目前常說的雙目系統。優化
可是雙目系統有一個很是突出的缺點:即左右視圖上同名點(對應物理空間位置同一點)的匹配問題,在物體表面紋理(或者週期性紋理)特徵不明顯的狀況下,這種匹配將變得很是困難,典型的一個示例以下:編碼
圖2 低紋理表面雙目成像匹配困難 [11]
主動式雙目是對於雙目系統的加強,本質上仍是雙目系統,其特色是在雙目系統的基礎上增長了一個主動式光源(或者相似的主動式增長紋理的裝置)。爲了繼續簡化系統,同時兼顧主動式雙目系統可以解決低紋理表面匹配問題的特色,行業內發展出告終構光系統:將雙目中一個相機換成一個投影儀,用於向物體表面投射特殊的紋理圖案。
圖3 結構光方案投射特殊紋理示意圖 [11]
結構光方案集以前方案優勢於一身,因爲光路可逆性原理,使用投影儀代替相機不只符合雙目三角法基本物理原理,並且能夠向物體表面投射特殊圖案,避免了低紋理表面的匹配困難問題。目前來講,結構光系統技術方案通常可經過投射的圖案來進行區分:
·條紋結構光:早期的結構光技術,因爲條紋的週期性,必須使用多組不一樣週期或者不一樣相位的條紋圖案進行編碼,不然會出現誤匹配,可是使用多組條紋圖案會形成實時性較差,動態場景受影響尤爲明顯,因此目前常見於靜態模型掃描 [1];
·散斑結構光:近期發展起來的一種結構光技術,早期也有人稱之爲「One snapshot」技術,經過單張圖案便可完成深度恢復,要求圖案必須局部隨機,該技術在動態場景下識別較好,典型產品就是Prime Sense、Kinect-V1 [2]。
第二章
雙目算法與結構光算法
不管是雙目算法仍是結構光算法,從上述歷史發展來看,其基本物理原理都是雙目三角法,因此算法核心在於圖像匹配,經過圖像匹配技術尋找像素視差,從而最終獲得Z軸深度值。兩種算法的不一樣之處在於:雙目算法經過左右視圖進行圖像匹配獲得視差,結構光算法經過單一視圖和投影圖案進行圖像匹配(通常這張投影圖案被稱爲參考圖)。
以目前最多見的散斑結構光爲例,結構光算法總體流程以下圖所示:
圖 4 單目結構光算法流程
在工程實現時,須要根據實現平臺(CPU/FPGA/ASIC)的特色,對每一個模塊做出調整,平衡算力、存儲、時延、分辨率、幀率和傳輸帶寬等諸多因素,使總體性能達到最優的效果。接下來算法詳述咱們先從雙目算法講起,再擴展到結構光算法。
1、最簡單的雙目測距系統
首先從最簡單的雙目測距系統提及,以下圖所示:
圖5 正面平行雙目系統
假定左右兩個攝像頭參數徹底一致,基線(兩個光心的連線)與兩個成像面平行,且左右攝像頭每一個對應的像素行對齊(row-aligned),咱們稱這樣的雙目系統爲正面平行系統(frontal parallel)。
根據類似三角形,能夠獲得:
這就是基本的雙目三角法原理,從上面的公式可知,視差(disparity)與距離(distance)Z成反比,以下圖所示:
圖6 視差與距離之間的對應圖 [12]
從上面的公式能夠看出,若是要計算空間點P的深度Z,必需要知道:
一、相機焦距f,左右相機基線b——這些參數能夠經過相機標定獲得;
二、視差d——即左相機成像面上的每一個像素點和右相機成像面上的對應點
的關係,這就是雙目算法的核心:匹配
回顧以上,咱們獲得結論:理想的正面平行雙目系統,須要經過相機標定獲得相機內外參才能計算深度。可是現實世界中的雙目攝像頭沒法達到理想環境,因此須要採用某種算法,對實際的雙目成像系統進行補償、矯正,譬如將採集到的左右圖變形(warp),使之行對齊。爲了實現這一點,須要引入極幾何(epipolar geometry)的概念。
2、極線約束
圖7 極平面和極線 [12]
如上圖所示, 是兩個相機的光心,P是三維空間中的任意一點,和兩個相機的光心
造成了三維空間中的一個平面
,稱爲極平面(epipolar plane)。極平面和兩個相機的像平面分別相交於兩條直線,這兩條直線稱爲極線(epipolar line)。
與兩個相機的像平面的交點
,稱爲極點(epipole)。P在相機
的像平面中的成像點是
,在相機
的像平面中的成像點是
。
咱們的目標是:對於左圖的,尋找它在右圖中的匹配點
,而後利用三角測距原理肯定P在三維空間中的位置。爲了可以減少的搜索範圍,咱們引入極線約束(epipolar constraint)的概念——對於任意一個三維空間點P,已知它在左圖的成像點
,那麼對應右圖的匹配點
必定位於相對於
的極線上,這就將搜索範圍從一個二維的區間壓縮到了一個一維的線段,大大下降了計算量,以下圖所示。顯然,成像面上的全部極線都相交於極點,好比圖7中右圖上的全部極線都相交於
。
圖8 匹配點與極線約束 [11]
在極線約束下雖然匹配範圍縮小到了一個一維的線段,可是實際計算起來仍是不方便。並且即便找到匹配點,將視差轉化爲深度也比較繁瑣。這種狀況下,雙目系統的標定(calibration)就很是重要了,經過標定獲得內外參矩陣,使用相機內外參對左右視圖進行矯正(rectification),使得左右視圖的極線重合,以下圖所示,這樣匹配搜索只須要在水平方向進行便可。須要注意的是,雙目系統的內外參不只僅會影響深度絕對精度,還會影響雙目系統的極線矯正。
圖9 雙目系統的矯正 [11]
什麼是極線矯正呢?簡單的講,就是咱們經過標定獲得的內外參,計算出兩個單應性矩陣(homography),分別對左右視圖進行變形(warp),使得左右視圖的極點都被挪到了無窮遠處,而且極線行對齊(row-alignment),這樣就能夠直接使用理想正面平行雙目系統計算深度信息。
3、匹配計算
如上述,雙目算法的核心在於匹配,這點對於結構光算法也是同樣。深度計算的過程是得出所拍攝到的範圍內每個點的深度值,對於雙目系統而言,就是檢測每個點在左圖相對於右圖的同名點,尋找同名點的方法就是匹配:經過對左圖當前點提取特徵並與右圖必定範圍內的全部點進行匹配(matching),左右圖上同名點的像素差別就是視差。
視差計算方法按照匹配算法大致能夠分爲三類:局部匹配算法(Block Matching)、全局匹配算法(Global Matching)、半全局匹配算法(Semi-Global Matching)[3][4][13]。
·局部匹配算法:利用鄰近局部區域的紋理約束信息(同名點的紋理信息一致),具備算法簡單、運算速度快的優勢。可是該方法一般只能得到在某個區域內的最優視差,沒法在整個圖像範圍內進行視差的優化,對於遮擋和弱紋理等也比較敏感,容易形成誤匹配。通常會增長後處理算法對原始視差圖進行優化;
·全局匹配算法:利用圖像的全局約束信息,該算法首先要定義一個能量函數,該能量函數表徵左圖和變換後右圖的類似性,而後使用有效的計算方法來尋找全局最小能量,相對應的變換函數就是全局視差,優勢是對圖像的模糊不敏感,可以給出兩幅圖像重疊區域中絕大部分像素的視差值,但計算代價很高,不適合在工程實踐中應用;
·半全局匹配算法:綜合了局部匹配和全局匹配的優點,經過Block Matching的方法計算代價空間(Cost Volume),而後在每一行上尋找最佳視差路徑,該視差路徑可使整行匹配代價最低(路徑規劃使用動態規劃算法(Dynamic Programming)),這種算法的優點是匹配精度高,並且計算量遠遠小於全局匹配,可以使用在GPU、高端FPGA平臺上,通常的CPU平臺仍不太適合部署。
在實際工程應用中,絕大多數的匹配計算能夠歸納爲下面4個步驟:
圖10 視差計算流程 [13]
局部匹配算法會依次執行上面前3步,一般在第3步採用一個簡單的贏者通吃(Winner Takes All,WTA)策略 [5],得到視差值;全局算法每每會跳過「代價聚合」這一步,直接到第3步。
匹配代價(matching cost)計算是雙目算法中最核心的模塊,它的優劣直接關係到深度計算的精度和質量[6]。那麼它如何計算呢?咱們要引入一個名詞——特徵(feature),畫面中不一樣像素點的特徵不一樣,咱們能夠經過特徵來尋找左右視圖的同名點。
這裏介紹一種在雙目算法和散斑結構光算法中都很是經常使用的特徵:像素的灰度值,對應的匹配代價就是SAD:待匹配像素鄰域內全部像素的AD之和(灰度值差的絕對值 (Absolute Differences,AD))。
圖11 匹配代價計算 [11]
如上圖所示,咱們會在搜索範圍(水平極線)上計算像素的匹配代價(SAD)。
圖12 WTA得到視差 [11]
如圖12所示,咱們會在視差搜索範圍內比較獲得的每一個代價值,而後選取最小的代價值對應的視差做爲該像素的視差結果。
可是這種視差計算僅僅考慮了孤立的局部信息,沒有充分考慮領域的視差信息,在正常的物理環境下,相鄰點的視差是連續的,匹配代價也應該是連續的,順着這個思路,就發展出了代價聚合(Cost Aggregation)[7]:
Cost Aggregation=Cost(data)+Cost(smooth)
Cost(smooth)來自於領域點的視差傳遞,經過這種方法,能夠有效提高視差計算的準確度,下面是一張對比圖:
圖13 代價聚合先後對比 [11]
最後再簡單介紹一下視差細化。一般狀況下,咱們在通過上面介紹的3步(匹配代價計算→代價聚合→視差計算)後獲得的視差是像素級的精度,可是有些應用咱們但願能達到亞像素級精度 [8][9],這樣咱們就須要對獲得的視差作細化(refinement),最多見的細化操做就是二次插值。
圖14 亞像素插值 [11]
如圖14所示,咱們最初獲得的最小代價對應的視差是13,利用相鄰的3個點作二次曲線擬合,而後取二次曲線最小值對應的視差(12.8)做爲最終的視差結果。經過視差細化咱們能夠獲得亞像素精度的深度圖,可是有一點須要注意的是:亞像素畢竟是一種插值方法,經過算法對亞像素視差位置進行預測,不一樣的場景適合的亞像素插值方法是不一樣的。舉個例子,對於高紋理區域,二次曲線擬合比較適用,可是低紋理區域,二次曲線擬合的結果並很差。
4、散斑結構光算法
前面的章節咱們介紹了雙目立體匹配的算法框架,下面以散斑結構光[10]爲例,分析結構光算法與雙目算法的區別與聯繫。
仍以正面平行雙目系統爲例:假設其中左相機被替換爲投影儀,該投影儀投射出一副圖案,若是咱們在距離D1和D2分別放一塊幕布,右相機去拍攝幕布上的圖案,因爲上面所說的極線約束,右相機拍攝到的兩幅圖案只是在行方向上的偏移關係,圖案自己結構不會發生任何變化。這就引出了散斑結構光的一條重要原理:對於理想散斑結構光系統而言,散斑圖案在不一樣距離上是總體移動的,散斑大小和分佈模式不會隨距離變化而變化。
順着這個原理,咱們就能夠很是容易設計出一套散斑結構光系統:使用幕布(或者白牆)在某個距離下獲取一張參考圖像,其餘距離的圖像和這張圖像都是行方向的平移關係,散斑結構光算法計算的本質就是計算物體散斑圖和參考散斑圖的行方向平移關係,從而獲得視差,最終計算出每一個點的深度值。
爲了詳細解釋這個平移不變性,圖15是一個典型的散斑結構光成像系統的原理圖,圖中I是激光散斑發射器,假設它投影的兩條射線IG 和IH 爲投影散斑的兩個斑點,它在反射面1 和反射面2 上的兩個斑點之間的距離分別爲EF 和GH,EF 在成像面上對應的斑點像的距離爲AB,GH 在成像面上的對應的斑點像的距離爲CD。假定反射面1和反射面2與相機的垂直距離分別爲L1和L2,相機焦距爲f,基線MI爲b。
圖15 散斑成像示意圖
由於△ABM與△EFM類似,因此 ;由於△CDM與△GHM類似,因此
; 由於△IEF與△IGH類似,因此
;綜上可得 AB=CD。
也就是說,雖然深度越大,散斑之間的距離越大,可是距離越大,成像透鏡對其縮小的倍數也越大,相互抵消,從而致使散斑之間的距離在成像面上的成像與深度無關。同理,能夠證實,散斑的大小也不會隨着深度的變化而在成像面上發生變化。因此散斑間的距離,斑點大小以及散斑分佈模式在不一樣深度的反射面上成像是基本相同的。散斑圖中物體深度發生變化時,只有物體上的散斑圖總體移動,因此咱們可使用匹配的方法將物體散斑圖與參考散斑圖進行匹配。
圖16 散斑圖
左右圖分別是在不一樣距離下拍攝的平面散斑圖
如圖16所示,能夠很容易看出,散斑總體發生了偏移,與上面的理論分析一致。
整體來看,散斑結構光算法與雙目算法很是相似,其核心都在於匹配。
上述的全部推導,都是基於理想平行雙目系統,實際環境中,不會存在這樣的理想系統,那麼咱們如何仿照雙目算法的處理方式,對散斑結構光系統進行矯正。
核心仍是在於標定,咱們須要對散斑發射裝置(譬如投影儀)和相機進行位置關係標定,經過標定出來的系統參數,一樣能夠對散斑結構光系統作極線矯正,這點對於實際散斑結構光相機很是重要。
另外,散斑結構光系統對於散斑模式是有隨機性要求的。隨機性需求的核心是爲了解決匹配過程當中的誤匹配問題,因此這種隨機只要求在搜索範圍內隨機便可,3D結構光都是採用VCSEL隨機點陣的散斑發射器+DOE複製的方案,來減小無匹配發生的機率。
滑動查看參考文獻
蘇顯渝, 張啓燦, & 陳文靜. (2014). 結構光三維成像技術. 中國激光, 41(2), 0209001.
蔡贊贊. (2018). 結構光技術解析及應用. 中國新通訊, (11), 87.
趙晨園, 李文新, & 張慶熙. (2020). 雙目視覺的立體匹配算法研究進展. 計算機科學與探索, 1-13.
笪健, 屈惠明, 陶天陽, 陳錢, & 左超. (2016). 結合極線約束和散斑相關的實時三維測量方法. 光學學報, 36(10), 1012003.
趙亮亮. (2007). 雙目立體視覺中的圖像匹配技術研究 (Doctoral dissertation, 南京航空航天大學).
Lazzaro, J., Ryckebusch, S., Mahowald, M. A., & Mead, C. A. (1989). Winner-take-all networks of O (n) complexity. In Advances in neural information processing systems (pp. 703-711).
黃子月. (2018). 雙目視覺局部代價聚合匹配算法研究 (Master's thesis, 燕山大學).
潘兵, 謝惠民, 續伯欽, & 戴福隆. (1900). 數字圖像相關中的亞像素位移定位算法進展. 力學進展, 35(3), 345-352.
劉衛光, 崔江濤, & 周利華. (2005). 插值和相位相關的圖像亞像素配準方法. 計算機輔助設計與圖形學學報, 17(6), 1273-1277.
張紹陽, 侯旭陽, 崔華, & 高小梅. (2016). 利用激光散斑獲取深度圖. 中國光學, 9(6), 633-641.
Stefano Mattoccia. (January 12, 2013). Stereo Vision: Algorithms and Applications.
Adrian Kaehler & Gary Bradski.(2016.12.09). Learning OpenCV 3 Computer Vision in C++ with the OpenCV Library.
Daniel Scharstein & Richard Szeliski(2002). A Taxonomy and Evaluation of Dense Two-Frame Stereo Correspondence Algorithms.
本文僅作學術分享,若有侵權,請聯繫刪文。
下載1
在「3D視覺工坊」公衆號後臺回覆:3D視覺,便可下載 3D視覺相關資料乾貨,涉及相機標定、三維重建、立體視覺、SLAM、深度學習、點雲後處理、多視圖幾何等方向。
下載2
在「3D視覺工坊」公衆號後臺回覆:3D視覺github資源彙總,便可下載包括結構光、標定源碼、缺陷檢測源碼、深度估計與深度補全源碼、點雲處理相關源碼、立體匹配源碼、單目、雙目3D檢測、基於點雲的3D檢測、6D姿態估計源碼彙總等。
下載3
在「3D視覺工坊」公衆號後臺回覆:相機標定,便可下載獨家相機標定學習課件與視頻網址;後臺回覆:立體匹配,便可下載獨家立體匹配學習課件與視頻網址。
重磅!3DCVer-學術論文寫做投稿 交流羣已成立
掃碼添加小助手微信,可申請加入3D視覺工坊-學術論文寫做與投稿 微信交流羣,旨在交流頂會、頂刊、SCI、EI等寫做與投稿事宜。
同時也可申請加入咱們的細分方向交流羣,目前主要有3D視覺、CV&深度學習、SLAM、三維重建、點雲後處理、自動駕駛、CV入門、三維測量、VR/AR、3D人臉識別、醫療影像、缺陷檢測、行人重識別、目標跟蹤、視覺產品落地、視覺競賽、車牌識別、硬件選型、學術交流、求職交流等微信羣。
必定要備註:研究方向+學校/公司+暱稱,例如:」3D視覺 + 上海交大 + 靜靜「。請按照格式備註,可快速被經過且邀請進羣。原創投稿也請聯繫。
▲長按加微信羣或投稿
▲長按關注公衆號
3D視覺從入門到精通知識星球:針對3D視覺領域的知識點彙總、入門進階學習路線、最新paper分享、疑問解答四個方面進行深耕,更有各種大廠的算法工程人員進行技術指導。與此同時,星球將聯合知名企業發佈3D視覺相關算法開發崗位以及項目對接信息,打形成集技術與就業爲一體的鐵桿粉絲彙集區,近2000星球成員爲創造更好的AI世界共同進步,知識星球入口:
學習3D視覺核心技術,掃描查看介紹,3天內無條件退款
圈裏有高質量教程資料、可答疑解惑、助你高效解決問題
以爲有用,麻煩給個贊和在看~