吳劍鋒 蔣濛婷 馬夢鑫 羅 凱
(浙江工業(yè)大學(xué) 浙江 杭州 310023)
三維重建(3D Reconstruction)技術(shù)是指在計算機(jī)環(huán)境下對人物或物體建立能完整表示和處理的三維模型,它屬于計算機(jī)視覺的一個分支。目前三維重建技術(shù)已在多個領(lǐng)域里面得到廣泛應(yīng)用,如醫(yī)學(xué)、歷史文化遺產(chǎn)保護(hù)、游戲、虛擬現(xiàn)實、逆向工程等。
現(xiàn)如今,三維重建的軟硬件實現(xiàn)技術(shù)有很多,在不同的行業(yè)根據(jù)自身的特點也會選擇不同的方法。例如在建筑行業(yè),一般采用合成孔徑雷達(dá)SAR(Synthetic Aperture Radar)技術(shù)、無人機(jī)航拍等獲取三維重建數(shù)據(jù),如黃佳彪等[1]的研究,馮荻[2]的三維重建技術(shù)研究。在醫(yī)學(xué)領(lǐng)域,一般采用計算機(jī)斷層掃描技術(shù)、超聲圖像、CT掃描等方式獲取精確數(shù)據(jù),如魯媛媛等[3]在乳腺腫瘤領(lǐng)域的研究,萬建省等[4]在復(fù)雜腎結(jié)石經(jīng)皮腎鏡取石術(shù)中的應(yīng)用探討。上述領(lǐng)域?qū)θS重建精度有極高的要求,因此整個過程所需的硬件設(shè)備價格昂貴,重建技術(shù)復(fù)雜,無法普及。本文采用Kinect硬件設(shè)備用于獲取三維重建數(shù)據(jù),極大降低了設(shè)備成本以及技術(shù)復(fù)雜度,更加利于三維重建技在教學(xué)和生活上的廣泛普及。
自微軟發(fā)布Kinect的開發(fā)框架SDK后,國內(nèi)外眾多學(xué)者都參與研究其在三維重建技術(shù)領(lǐng)域上的實現(xiàn)方法和實際應(yīng)用價值。由Newcombe等[5]開發(fā)的KinectFusion系統(tǒng)可以說是具有里程碑的意義,利用Kinect獲取三維點云數(shù)據(jù),并通過迭代最近點算法來進(jìn)行配準(zhǔn),最后TSDF點云融合算法完成重建。此方法重建精度低,不適用大范圍場景,對環(huán)境有一定限制,對進(jìn)行重建技術(shù)的計算機(jī)要求高。針對KinectFusion的缺點,國內(nèi)外的學(xué)者用不同方式進(jìn)行了改進(jìn),并取得了一定進(jìn)展。Whelan等[6]的Kintinuous對KinectFusion算法改進(jìn),使之能夠用于大范圍場景重建。Keller等[7]對KinectFusion算法進(jìn)行了改進(jìn),采用基于點的重建方式代替原本基于體素的重建方式。Zeng等[8]用八叉樹代替原有三維數(shù)組數(shù)據(jù)結(jié)構(gòu),減少了計算機(jī)存儲空間浪費(fèi),提高了重建精度以及重建范圍。朱笑笑等[9]通過添加環(huán)境邊線特征點匹配以及地面點云,提高了原算法的魯棒性以及重建精度。
本文通過Processing平臺進(jìn)行三維重建,相比其余平臺,該平臺操作更加便捷、簡易,更利于在教育及生活中普及三維重建。本文首先對深度圖像數(shù)據(jù)進(jìn)行雙邊濾波處理,去除采集過程中產(chǎn)生的噪點,通過OpenNI坐標(biāo)轉(zhuǎn)移技術(shù)獲取光滑三維點云。其次,在點云融合過程中,提出通過ICP算法構(gòu)建表面網(wǎng)格獲取三維模型,再利用3D打印修復(fù)技術(shù)進(jìn)行模型修復(fù),與KinectFusion的TSDF點云融合方法相比,雖在模型精度上些許下降,但能大大提高重建效率,更適合在工業(yè)設(shè)計、產(chǎn)品設(shè)計、輔助教育等領(lǐng)域應(yīng)用。
利用Kinect平臺,基于OpenNI框架下,采用Processing的SimpleOpenNI庫來進(jìn)行對物體的三維點云數(shù)據(jù)的獲取。而所有的三維點云數(shù)據(jù)都是在Kinect的深度圖像中獲取,Kinect的深度圖像是由其自帶的紅外投影機(jī)和紅外攝像頭配合獲取而得,如圖1所示。

圖1 Kinect深度流數(shù)值
獲取到得每個像素點數(shù)據(jù)都是一個為兩個字節(jié)的數(shù)據(jù),即共16 bit數(shù)據(jù),其中前13個bit就是每個像素的深度值。在空間坐標(biāo)(x,y,z)中,所獲取的深度圖平面坐標(biāo)(x,y)以目標(biāo)位置為參考平面,z代表Kinect傳感器與物體目標(biāo)的距離(即圖中的攝像頭與物體的深度),如圖2所示。

圖2 Kinect深度數(shù)據(jù)流
利用Kinect獲取深度圖像數(shù)據(jù)過程中,由于自身信號傳輸和環(huán)境因素的干擾,不可避免地會出現(xiàn)一定的噪聲。這會影響到后續(xù)三維重建的計算過程,因此需要對獲得的深度數(shù)據(jù)進(jìn)行濾波處理。本文采用的是雙邊濾波算法[10],其是高斯濾波算法的改進(jìn)算法,特點是采用灰度域權(quán)值和空間域權(quán)值優(yōu)化圖像邊緣數(shù)據(jù)。對深度圖像D中的點p(x,y)計算方法如下:
(1)
(2)
式中:q是點p領(lǐng)域中的點,δs2和δr2為灰度域權(quán)值和深度域權(quán)值。
通過OpenNI的坐標(biāo)轉(zhuǎn)移技術(shù),提高掃描獲取光滑的三維點云數(shù)據(jù)。如圖3所示。

圖3 通過程序改變掃描角度獲得點云數(shù)據(jù)
通過上述方法獲取三維點云數(shù)據(jù)后,盡管在屏幕上顯示的是連續(xù)的圖像,但這技術(shù)還是不具備能夠?qū)D像打印成物理所需的數(shù)據(jù)結(jié)構(gòu)。點云數(shù)據(jù)中的點定位在3D空間中,但它們并不是以描述一個可以打印的實際表面。為了能構(gòu)建一個表面,就必須對所有的點云數(shù)據(jù)進(jìn)行構(gòu)建網(wǎng)格生成表面。
用迭代最近點算法ICP(Iterative closest point)[11]來構(gòu)建三角形網(wǎng)格。Kinect在開始掃描的時候,從一個單獨的深度點的索引開始,然后計算如何將這個點與鄰近的點連接起來,形成能添加至網(wǎng)格的三角形。如圖4所示。

圖4 三角形索引點圖
在一個每行4個共3行的深度點中,由于Kinect獲取的深度點云并不是整齊排列在行中的,而是根據(jù)落在物體表面的區(qū)域而輕微分散的。如圖4所示,黑色點表示當(dāng)前點,用羅盤的方法來命名各個角:NW為當(dāng)前點,它將構(gòu)成左上角,NE為右上角,而SW和SE為下面兩個。現(xiàn)在要計算這四個角的索引i(即搜索編號),第一個點NW比較簡單,利用式(3),將深度點的x-y位置變換為索引;其他3個點分別在x軸和y軸上有s行的位移,即NE點的索引為(x+s)+y×640,SW點為x+(y+s)×640,SE點為(x+s)+(y+s)×640。
i=y×640+x
(3)
計算出4個點的索引后,根據(jù)右手準(zhǔn)則增加頂點,這樣就可把這4個點定義的平面分割成兩個三角形:分別是NW到NE到SW和NE到SE到SW,如圖5所示。

圖5 三角形網(wǎng)格的構(gòu)成圖
為了得到每一個點的位置,就必須要計算它們在深度點數(shù)組中的索引。當(dāng)前點完成索引工作后,就從NE點開始,NE是緊挨著當(dāng)前點右側(cè)的點,為了能找到它的索引,就要在當(dāng)前點的索引上增加一個變量r,從而來計算當(dāng)前行下一個位置的深度點。其中SW是開始點的下一行,在構(gòu)建網(wǎng)格過程中,如果要用到所有行的深度點,那只需要每次都下移一行,但是,為了加快掃描的速度,采用減少掃描密度的方法,隨機(jī)跳過一些行。當(dāng)跳過一些行后,為了能重新找到索引點,這里就用變量r來判斷,當(dāng)算出SW的索引后,那么SE也就自然簡單可以計算而得。
通過如此的方法得到平面的三角形,應(yīng)用到3D幾何中也是類似的方法,三角形本身就是3D幾何的基本原子單元。通過把Kinect獲取的深度點連接成一個平滑的表面,如圖6所示。如在150像素的立方體上的兩個面,把每個面拆分成兩個三角形,每一個三角形連接都是由組成面的四個點中的三個點組成,而每個點最終都屬于多個三角形。

圖6 立體網(wǎng)格的構(gòu)成圖
通過上述網(wǎng)格構(gòu)建技術(shù),通過Processing的Modelbuilder庫導(dǎo)出STL模型文件后,用微軟的3D builder打開發(fā)現(xiàn),掃描獲得的網(wǎng)格一片混亂,如圖7所示。這并不是在上一步進(jìn)行三角形網(wǎng)格構(gòu)建的時候出現(xiàn)的錯誤,如果將圖進(jìn)行拉伸,所有的表面還是可以看到,只是背景前后錯位。

圖7 背景前后錯層圖
在構(gòu)建網(wǎng)格中,采用的是迭代鄰近點的方法,但是在Kinect的深度圖中是有很多孔洞的,而根據(jù)深度圖生成原理中,這些孔洞的坐標(biāo)都是(0,0,0),當(dāng)去迭代這些點時就會導(dǎo)致背景和物體的錯位。對于一個可打印的3D模型,它必須是無縫的,即需要一個連續(xù)的立體表面,所有的法線必須朝向外側(cè)。
計算法線的方法可以非常簡單,如對每一個點,取和它相鄰的兩個點組成三角形,計算三角形的法向即為該點的法向。但是這種方法很不精確,其中有一個點的坐標(biāo)稍有變化,就會影響最終法線的方向。
要解決這個問題,采用的方法是考慮一個點周邊的所有的點,使用最小二乘法來擬合一個最佳平面,這個平面的法向即為該點的法向[12]。首先要計算該點以及周邊的所有點到這個平面的距離之平方和最小:
(4)
式中:M為所有點到平面的距離平方和,a、b、c是決定這個平面的參數(shù),也就是這個平面的法矢量(a,b,c)。x、y、z是該點的坐標(biāo),為了求出合適的a、b、c值,對三個變量分別求偏導(dǎo):
(5)
(6)
(7)
通過公式計算出a、b、c值,即可得到該面的法向。在Kinect獲取到深度圖像數(shù)據(jù)后,通過上述方法進(jìn)行修復(fù)處理。修復(fù)結(jié)果如圖8所示。

圖8 錯層修復(fù)圖
在進(jìn)行修復(fù)處理后,已經(jīng)將三維表面連接成面了,但由于構(gòu)建網(wǎng)格是三角形網(wǎng)格,即表面都是三角形,這樣導(dǎo)出模型的表面相對粗糙。為了能快速地生成打印格式文件,本文通過微軟的3D builder軟件進(jìn)行一鍵手動修復(fù)表面,修復(fù)的過程中也能調(diào)整好打印所需的切片文件,如圖9所示。

圖9 表面光滑處理圖
通過上述處理后,就可以得到進(jìn)行3D打印前的模型文件,導(dǎo)出成stl格式后完成打印工作。
上述Kinect的三維重建技術(shù)結(jié)合3D打印技術(shù)在輔助教學(xué)方向具有重要的應(yīng)用價值,以下以立體幾何結(jié)構(gòu)輔助教學(xué)應(yīng)用為例。立體幾何結(jié)構(gòu)的學(xué)習(xí)在機(jī)械結(jié)構(gòu)設(shè)計和產(chǎn)品結(jié)構(gòu)設(shè)計中都起著至關(guān)重要的作用。但是在教學(xué)過程中,如果沒有用具體的結(jié)構(gòu)實物來講解,學(xué)生往往很難靠想象來記住復(fù)雜的結(jié)構(gòu),特別是多結(jié)構(gòu)體的相互穿插,產(chǎn)生的交插截面是很難想象出來的,只靠講解和平面圖是較難理解和掌握。
如果應(yīng)用本文所講述的技術(shù),即利用Kinect對多個幾何結(jié)構(gòu)物體進(jìn)行分別掃描重建,通過微軟開發(fā)的3D builder軟件對多個三維幾何圖形進(jìn)行組合,通過3D打印機(jī)打印出組合模型,這樣就可從實物上一目了然地看到新物體的結(jié)構(gòu),從而達(dá)到輔助教學(xué)的目的。而且,對比傳統(tǒng)的KinectFusion的應(yīng)用方法,其優(yōu)勢非常明顯,整個掃描、建模到打印過程快速簡單、效率高、對硬件的要求低,一般的教學(xué)設(shè)備即可滿足。具體的實現(xiàn)流程如圖10所示。
本實驗具體以兩把不同椅子組合模型為例。兩把椅子結(jié)構(gòu)融合交錯,如果沒有結(jié)構(gòu)實體,很難想象出各個交錯截面的結(jié)構(gòu)樣式。因此使用上述方法,可以通過得到的實物,清晰地從不同角度和深度來體現(xiàn)。根據(jù)上述流程圖,首先通過Kinect的紅外攝像頭和紅外投影儀來分別獲取兩把椅子的深度圖像。對于獲取到的深度圖像,在程序中,可以直接得到每個像素點的三維數(shù)據(jù),并可通過坐標(biāo)轉(zhuǎn)換實現(xiàn)各個位置的點云數(shù)據(jù),如圖11所示。

圖11 兩把椅子的點云數(shù)據(jù)圖
對于調(diào)整好角度的點云數(shù)據(jù),利用迭代最近點算法(ICP)進(jìn)行三角形網(wǎng)格構(gòu)建,從而融合所有點云實現(xiàn)三維重建,用3D builder打開,如圖12所示。

圖12 3Dbuilder椅子模型效果圖
為了避免導(dǎo)出三維模型數(shù)據(jù)的背景與物體前后交錯的現(xiàn)象,采用網(wǎng)格修正算法對所有的點云數(shù)據(jù)進(jìn)行修正。利用Processing的ModelBuilder庫進(jìn)行STL文件的導(dǎo)出,再利用微軟的3D builder軟件進(jìn)行修復(fù)重組,如圖13所示。

圖13 3Dbuilder修復(fù)重組模型效果圖
對得到的STL文件模型利用桌面3D打印機(jī)進(jìn)行實體模型打印。打印結(jié)果如圖14所示。

圖14 實體打印模型
通過該實驗證明,在輔助教學(xué)中對復(fù)雜的結(jié)構(gòu)拼接和結(jié)構(gòu)教學(xué)都帶來更為直觀的呈現(xiàn),這樣就可以摒棄傳統(tǒng)教學(xué)中靠想象和平面圖示的抽象認(rèn)知。
本文利用Kinect三維重建技術(shù)結(jié)合3D打印技術(shù)研究在輔助教育領(lǐng)域的價值,采用Kinect的多深度圖像融合算法,通過微軟的3D builder平臺進(jìn)行優(yōu)化,基于桌面3D打印機(jī)實現(xiàn)實物模型輸出。在實驗中,本文是基于OpenNI框架,使用Processing的SimpleOpenNI庫進(jìn)行3D點云數(shù)據(jù)掃描,并用ModelBuilder庫進(jìn)行網(wǎng)格構(gòu)建輸出三維模型STL文件,根據(jù)上述實驗所得的組合實體模型,可以直觀地看出其幾何結(jié)構(gòu)穿插部分的輪廓,在輔助教育中帶來更為直觀正確的教學(xué)。這種快速的建模方法在其他領(lǐng)域也有很多快速高效的優(yōu)勢。