本文由作者原創,禁止轉載!
(一)原理簡述與硬體裝置與模組劃分
寫在前面的話
從2017年秋到2019年夏,從事三維掃描方向的研究也快滿兩年了。從最初的大三小白到製成一臺線鐳射三維掃描器再到畢設期間完成的雙目結構光三維掃描器,我似乎學到了許多知識,但仔細想想卻又發現可堪用者寥寥。所以計劃在此將之前的研究做一個總結,從雙目結構光三維掃描器入手:談談我對其原理之理解;介紹我所採用的一些硬體;主要寫寫三維掃描在軟體上的實現(包括功能上的模組化,以及各個模組的實現),也希望能為有志從事這方面工作的同學提供一點小小的幫助。在博文中出現的錯誤和疏漏還請諸位老師同學斧正,謝謝!
1.1 三維掃描原理簡述
三維掃描的原理有很多,大體上可以分為“接觸式”和“非接觸式”兩種,其中“接觸式”在這裡不做贅述。“非接觸式”中有包含鐳射三角法、飛行時間法(TOF)、紅外散斑技術、傅立葉變換輪廓術等等。
我採用的是雙目立體視覺和編碼結構光相結合的一種方法[1],屬於“非接觸式”。在實現基於這一原理的三維掃描器後,我的直觀感受是(1)原理並不複雜,這使得程式設計的難度大大降低;(2)硬體要求很低,完全不用考慮電路設計,買現成的便攜投影儀和CMOS或CCD就可以;(3)效果拔群,主要體現在精度較高和掃描速度快這兩點上。
那麼閒言少敘,下面開始介紹。既然是“雙目立體視覺和編碼結構光相結合的方法”,那就得了解“雙目立體視覺”和“編碼結構光”在這個方法中起到了什麼作用。
首先,“雙目立體視覺”,簡單而言就是利用不同位置的兩臺相機取得同一場景的兩幅視差影象[1],然後通過某種方法確定物體上一點在對應兩幅圖片中的位置,從而得到該點的三維座標資訊(具體的數學推導在另一篇博文中補充),從而得到整個物體的三維點雲模型。如圖1所示。
圖1
其次,“編碼結構光”就是用來確定物體上一點在對應兩幅圖片中的位置的某種方法,我使用的是格雷碼編碼的結構光,通過將格雷碼編碼圖案投影到物體表面,可以將物體表面上每一個點(準確來說應該是每一個子區域)都賦予一個獨一無二的碼值,即特徵值。通過搜尋這個特徵值,我們就不難在兩幅圖片中找到對應的點了。
這樣原理部分就簡單說明完畢了,下面介紹一下我在製作掃描器時所使用的硬體裝置。
1.2 使用的硬體裝置
由於這臺三維掃描器僅僅依託於本科畢設,經費有限,同時我當時所在的實驗室內也沒有人從事這方面的研究,所以在硬體選型方面我大概瞭解了雙目結構光掃描器所需硬體之後,就在實驗室的現成器具中攢了一套裝置出來,好在後面證明這些裝置都是能勝任工作的。
下面將給出我所使用的硬體裝置。值得注意的是,這並非是廣告,選用同型別其他產品是完全可以的。如果你打算選用更加優質(昂貴?)的裝置,相信最終的掃描效果會更好。
行動式投影儀
我用的是投美公司的C800,行動式投影儀用於投射格雷碼編碼圖片,C800是安卓作業系統,可以用遙控器控制圖片投影,能夠外接U盤,這樣就可以很方
便的將格雷碼編碼圖片投影到物體上了。
圖2
成像裝置
採用的是MindVision公司出品的黑白工業相機MV-UB130M和中聯科創公司的2/3英寸靶面FA鏡頭HM0814MP5。雖然它們的價格比普通網路攝像頭貴很多,但是成像質量有保證,至少肉眼是無法發現畸變的。
其他
還有一些其他的小玩意兒。
HUB,膝上型電腦上的USB插口比較少,一個HUB可以輕鬆將兩個工業相機接入電腦。
三腳架,用來靈活調節投影儀高度。
固定板,用來固定兩個工業相機。
系統展示
圖3
1.3 模組劃分
下面將給出一種自頂向下的把複雜的三維掃描器系統按照功能劃分為不同模組的方法,方便我們按模組一步步實現它。但是在此之前,我們得先解決硬體和軟體的協同問題。
雙目結構光三維掃描器包括硬體與軟體,它們的協同問題將決定這臺機器能否執行成功。如果通過軟體來控制兩臺攝像機拍攝影象和投影儀投影圖片,我們不僅要額外編寫控制它們的程式碼,還必須面臨時序問題(時序問題曾在製作鐳射三維掃描器時給我造成了很大的麻煩)。
幸運的是,在面對這個問題時我們還可以選擇迴避它:)
自己無需編寫控制硬體的程式碼,只需要利用工業相機SDK中附帶的拍照例程,遙控器控制投影切換圖片,就可以得到我們需要的編碼影象和標定影象。而在程式碼部分我們需要做出的努力就是利用這些已經拍攝好並儲存在電腦本地的照片來構建三維點雲模型。
假如買到的相機並沒有例程可供使用呢?用OpenCV寫一個用來拍照的小程式吧,不會超過10行的(只要是由你本人來按下“快門”,不涉及協同與時序)。
現在,我們可以開始根據功能劃分模組了。
“生成格雷碼編碼圖案序列”模組
我們顯然需要一個能夠自由生成所需格雷碼編碼圖案序列的模組,這樣才能自由的調整三維掃描器的精度(是的,三維掃描器的精度與格雷碼編碼圖案,進一步地,與格雷碼的位數有關)
“相機標定”模組
我們需要利用張氏標定法將相機進行標定,用來獲得相機的內部引數,然後我們還需要立體標定,用來獲得相機的外部引數。
“特徵點提取”模組
用於處理相機拍攝的編碼圖案,在這一步驟中又可以分為三個模組(1)“二值化”模組;(2)“精細化”模組;(3)“獲取格雷碼碼值圖(矩陣)”模組。
“特徵點匹配和三維重構”模組
用來獲取點雲資料,並輸出三維點雲模型。
1.4 效果展示
先展示一下掃描效果吧。
圖4
圖5
好了,博文《如何製作一臺雙目結構光三維掃描器(一)》就到此結束啦:)
參考文獻
[1] 李靖, 王煒, 張茂軍. 雙目立體視覺和編碼結構光相結合的三維重建方法[J]. 計算機應用, 2012, 32(a02):154-158.