本文的目的就是對結(jié)構(gòu)光(Structured Light)技術(shù)做一個比較全面的簡介。 總體而言,所說的結(jié)構(gòu)光主要可以分為兩類 一般說結(jié)構(gòu)光的時候都指代第二類,這里也主要關(guān)注面陣結(jié)構(gòu)光。 線掃描結(jié)構(gòu)光較之面陣結(jié)構(gòu)光較為簡單,精度也比較高,在工業(yè)中廣泛用于物體體積測量、三維成像等領(lǐng)域。
通過上圖可以看到線掃描結(jié)構(gòu)光裝置的一個基本結(jié)構(gòu)。主動光源L緩慢掃過待測物體,在此過程中,相機記錄對應的掃描過程,最后,依據(jù)相機和光源在該過程中的相對位姿和相機內(nèi)參等參數(shù),就可以重建出待測物體的三維結(jié)構(gòu)。 其中, 為投影裝置的朝向。 則需要通過對應像素的像素坐標 和焦距f來確定。最終可知P點的三維坐標為: 可以看到,三維空間中的情形和之前的二維空間類似,作為俯仰角的 并沒有出現(xiàn)在公式中。 如上圖,相機與投影器等相對位姿都經(jīng)過了精確的校正,并且選取了測量臺上的一角作為原點建立物方坐標系。因此,激光投影器所投射的線激光在物方坐標系中可以通過一個平面方程來描述: 而相機光心的位姿通過幾何校正也已知,可以通過找到線激光在圖像中的對應像素重建出光心與像素的射線,射線和激光平面的交點即為待求的三維空間點。 面陣結(jié)構(gòu)光大致可以分為兩類:隨機結(jié)構(gòu)光 和編碼結(jié)構(gòu)光 。隨機結(jié)構(gòu)光較為簡單,也更加常用。通過投影器向被測空間中投射亮度不均 和隨機分布 的點狀結(jié)構(gòu)光,通過雙目相機成像,所得的雙目影像經(jīng)過極線校正后再進行雙目稠密匹配,即可重建出對應的深度圖。如下圖為某種面陣的紅外結(jié)構(gòu)光。 隨機結(jié)構(gòu)光這里就不再說了,因為和普通雙目算法是很相似的。一些額外的考慮就是是否給相機加裝濾光片、光斑的密度要到什么程度等硬件和光學的問題了。 這里主要討論編碼結(jié)構(gòu)光。編碼結(jié)構(gòu)光可以分為兩類: 如上圖,時序編碼結(jié)構(gòu)光即為在一定時間范圍內(nèi),通過投影器向被測空間投射一系列明暗不同的結(jié)構(gòu)光,每次投影都通過相機進行成像。假設(shè)共有n張影像,并設(shè)被陰影覆蓋的部分編碼值為1,未被覆蓋的部分編碼值為0。此時,每個像素都對應唯一一個長度為n的二進制編碼,雙目影像搜索匹配像素的問題就變成了查找具有相同編碼值的像素。如果雙目圖像已經(jīng)進行了極線校正,那么所投影的結(jié)構(gòu)光只需要在x方向上不具有重復性即可。 如上圖中,紅框內(nèi)的像素的編碼為0110,轉(zhuǎn)化為十進制則為5。此時,只需要在右圖相同行上檢索編碼值為5的像素即可。 上圖編碼方式稱為二進制碼 (binary code),每段區(qū)域不斷的進行二分下去直至投影的編碼寬度等于相機的像素寬度即可。對于寬度為1024的圖像,最少需要10張影像來進行編碼。 Binary Code 的一種改進為Gray Code . Gray Code比Binary Code具有更好的魯棒性,它使得相鄰兩個像素相差1bit。Gray Code的詳細介紹和其與Binary Code之間的轉(zhuǎn)換可以參考 wikipedia 。 注意觀察即可看到gray code和binary code在前幾行像素上的不同 自然,除了使用二進制的0-1編碼之外,還可以使用更多顏色層級的編碼。假設(shè)使用了M種不同的灰度層級進行編碼,則拍攝N張影像可以得到包含 個條帶的影響。如下圖中M = 3, N = 3時圖中有27條條帶。 由以上的介紹也可以得出時序編碼結(jié)構(gòu)光的優(yōu)缺點: 為滿足動態(tài)場景的需要,可以采用空間編碼結(jié)構(gòu)光。前面談到了隨機結(jié)構(gòu)光,就是不帶編碼信息,投影隨機紋理,而這里討論的空間編碼結(jié)構(gòu)光特指向被測空間中投影經(jīng)過數(shù)學編碼的、一定范圍內(nèi)的光斑不具備重復性的結(jié)構(gòu)光。由此,某個點的編碼值可以通過其臨域獲得。其中,包含一個完整的空間編碼的像素數(shù)量(窗口大?。┚蜎Q定了重建的精度。
2.2.1 德布魯因序列 (De Bruijn) 序列
德布魯因序列( 維基百科 )B(k, n) 表示用k個符號(如二進制,k = 2)來表示長度為 的循環(huán)編碼,n為一個編碼值的長度。
舉例:最簡單的,k = 2時,采用二進制符號(0, 1),編碼值的長度n = 2,可以得到一個長度為 的循環(huán)序列:[0, 0, 1, 1]。此時,我們得到4個長度為2的不同的編碼:[0, 0], [0, 1], [1, 1], [1, 0]. 因此,某種結(jié)構(gòu)光就可以按照該德布魯因序列進行編碼。而獲得的結(jié)構(gòu)光影像中,以上4個像素的編碼為[0, 0, 1, 1],通過一個大小為2的滑動窗口(假定一個結(jié)構(gòu)光光斑或光束的寬度是一個像素)即可獲取每個像素的編碼值。同樣地,如果是經(jīng)過極線校正的雙目圖像,只需要搜索對應的行即可,此時只要求編碼在x軸上不具備重復性。此時的結(jié)構(gòu)光就是豎直條帶狀的。 當然,為了提高編碼效率,也可以使用灰度圖、彩色圖像等比0-1編碼具有更多可能編碼值的投影方式。例如,對于RGB影像,采用二進制編碼(即某種顏色只有 有、無 兩種狀態(tài)),則共有 種顏色組合,去除(0, 0, 0),還剩下7種顏色。因此k = 7, n = 3,這樣就可以獲得一個長度為343的條帶序列。對于這個序列,唯一的約束為:相鄰的條帶不能為同樣的顏色。否則對于解碼算法來說很容易造成誤差。下圖展示了只使用5種顏色(k = 5, n = 3)的結(jié)構(gòu)光序列: 德布魯因序列是一種一維編碼,可以將之擴展到二維空間中,使得對于一個x * y大小的二維空間,其中一個w * h大小的子窗口所包含的編碼值在這整個二維編碼序列中只出現(xiàn)一次。 如上面中的4 * 6的M-arrays序列中,每個2 * 2大小的窗口所包含的編碼值都是唯一的。 同樣也可以利用RGB信息來進行二維編碼,有相關(guān)算法來產(chǎn)生一些偽隨機二維編碼。如在下圖中,左邊展示了一個6 * 6大小的二維矩陣,子窗口的大小為3 * 3。算法首先在左上角的3 * 3子窗口中隨機填入各種顏色;然后一個3 * 1大小的滑動窗口移動到右端第一個空白處,并隨機填入3中顏色;在填入生成的隨機顏色前,算法會先驗證子窗口的編碼的唯一性能不能得到保證,若不能,則會重新生成3中隨機顏色;如此循環(huán),只是在豎直方向上滑動窗口的大小變?yōu)? * 3,直至將整個6 * 6矩陣填滿。右圖則是該算法產(chǎn)生的某種偽隨機二維編碼的示例。 通過以上對空間編碼的討論,也可以看出空間編碼結(jié)構(gòu)光的一些優(yōu)缺點: 無需多張照片,只需要一對影像即可進行三維重建。可以滿足實時處理,用在動態(tài)環(huán)境中。 易受噪聲干擾:由于反光、照明等原因可能導致成像時部分區(qū)域等編碼信息缺失; 相較于時序編碼結(jié)構(gòu)光精度較低。 以上是對各種常用的結(jié)構(gòu)光技術(shù)的一些介紹。其實,三維重建中最常用的還是隨機面陣結(jié)構(gòu)光。通過向空間中投影這樣的隨機結(jié)構(gòu)光,再結(jié)合雙目稠密重建,可以獲得比單純使用RGB影像進行三維重建更加可靠和精確的結(jié)果。 最后,向?qū)Y(jié)構(gòu)光和三維重建感興趣的同學推薦一個項目:build your own 3D scanner。和名字一樣,網(wǎng)站上提供了自己使用觸手可及和低成本的設(shè)備來DIY一個3D掃描儀所需的一切,包括教程、ppt、代碼、數(shù)據(jù)和其他人的作品展示,感興趣的同學歡迎動手嘗試。
好消息,小白學視覺團隊的知識星球開通啦,為了感謝大家的支持與厚愛,團隊決定將價值149元的知識星球現(xiàn)時免費加入。各位小伙伴們要抓住機會哦!
下載1:OpenCV-Contrib擴展模塊中文版教程 在「小白學視覺 」公眾號后臺回復: 擴展模塊中文教程 , 即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理 等二十多章內(nèi)容。下載2:Python視覺實戰(zhàn)項目52講 在「小白學視覺 」 公眾號后臺回復:Python視覺實戰(zhàn)項目 , 即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別 等31個視覺實戰(zhàn)項目,助力快速學校計算機視覺。 在「小白學視覺 」 公眾號后臺回復:OpenCV實戰(zhàn)項目20講 , 即可下載含有20 個基于OpenCV 實現(xiàn)20個實戰(zhàn)項目 ,實現(xiàn)OpenCV學習進階。 交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺 、傳感器、自動駕駛、 計算攝影 、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽 等微信群(以后會逐漸細分), 請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過 。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿 在群內(nèi)發(fā)送廣告 ,否則會請出群,謝謝理解~