吳劍鋒 蔣濛婷 馬夢鑫 羅 凱
(浙江工業(yè)大學(xué) 浙江 杭州 310023)
三維重建(3D Reconstruction)技術(shù)是指在計(jì)算機(jī)環(huán)境下對(duì)人物或物體建立能完整表示和處理的三維模型,它屬于計(jì)算機(jī)視覺的一個(gè)分支。目前三維重建技術(shù)已在多個(gè)領(lǐng)域里面得到廣泛應(yīng)用,如醫(yī)學(xué)、歷史文化遺產(chǎn)保護(hù)、游戲、虛擬現(xiàn)實(shí)、逆向工程等。
現(xiàn)如今,三維重建的軟硬件實(shí)現(xiàn)技術(shù)有很多,在不同的行業(yè)根據(jù)自身的特點(diǎn)也會(huì)選擇不同的方法。例如在建筑行業(yè),一般采用合成孔徑雷達(dá)SAR(Synthetic Aperture Radar)技術(shù)、無人機(jī)航拍等獲取三維重建數(shù)據(jù),如黃佳彪等[1]的研究,馮荻[2]的三維重建技術(shù)研究。在醫(yī)學(xué)領(lǐng)域,一般采用計(jì)算機(jī)斷層掃描技術(shù)、超聲圖像、CT掃描等方式獲取精確數(shù)據(jù),如魯媛媛等[3]在乳腺腫瘤領(lǐng)域的研究,萬建省等[4]在復(fù)雜腎結(jié)石經(jīng)皮腎鏡取石術(shù)中的應(yīng)用探討。上述領(lǐng)域?qū)θS重建精度有極高的要求,因此整個(gè)過程所需的硬件設(shè)備價(jià)格昂貴,重建技術(shù)復(fù)雜,無法普及。本文采用Kinect硬件設(shè)備用于獲取三維重建數(shù)據(jù),極大降低了設(shè)備成本以及技術(shù)復(fù)雜度,更加利于三維重建技在教學(xué)和生活上的廣泛普及。
自微軟發(fā)布Kinect的開發(fā)框架SDK后,國內(nèi)外眾多學(xué)者都參與研究其在三維重建技術(shù)領(lǐng)域上的實(shí)現(xiàn)方法和實(shí)際應(yīng)用價(jià)值。由Newcombe等[5]開發(fā)的KinectFusion系統(tǒng)可以說是具有里程碑的意義,利用Kinect獲取三維點(diǎn)云數(shù)據(jù),并通過迭代最近點(diǎn)算法來進(jìn)行配準(zhǔn),最后TSDF點(diǎn)云融合算法完成重建。此方法重建精度低,不適用大范圍場景,對(duì)環(huán)境有一定限制,對(duì)進(jìn)行重建技術(shù)的計(jì)算機(jī)要求高。針對(duì)KinectFusion的缺點(diǎn),國內(nèi)外的學(xué)者用不同方式進(jìn)行了改進(jìn),并取得了一定進(jìn)展。Whelan等[6]的Kintinuous對(duì)KinectFusion算法改進(jìn),使之能夠用于大范圍場景重建。Keller等[7]對(duì)KinectFusion算法進(jìn)行了改進(jìn),采用基于點(diǎn)的重建方式代替原本基于體素的重建方式。Zeng等[8]用八叉樹代替原有三維數(shù)組數(shù)據(jù)結(jié)構(gòu),減少了計(jì)算機(jī)存儲(chǔ)空間浪費(fèi),提高了重建精度以及重建范圍。朱笑笑等[9]通過添加環(huán)境邊線特征點(diǎn)匹配以及地面點(diǎn)云,提高了原算法的魯棒性以及重建精度。
本文通過Processing平臺(tái)進(jìn)行三維重建,相比其余平臺(tái),該平臺(tái)操作更加便捷、簡易,更利于在教育及生活中普及三維重建。本文首先對(duì)深度圖像數(shù)據(jù)進(jìn)行雙邊濾波處理,去除采集過程中產(chǎn)生的噪點(diǎn),通過OpenNI坐標(biāo)轉(zhuǎn)移技術(shù)獲取光滑三維點(diǎn)云。其次,在點(diǎn)云融合過程中,提出通過ICP算法構(gòu)建表面網(wǎng)格獲取三維模型,再利用3D打印修復(fù)技術(shù)進(jìn)行模型修復(fù),與KinectFusion的TSDF點(diǎn)云融合方法相比,雖在模型精度上些許下降,但能大大提高重建效率,更適合在工業(yè)設(shè)計(jì)、產(chǎn)品設(shè)計(jì)、輔助教育等領(lǐng)域應(yīng)用。
利用Kinect平臺(tái),基于OpenNI框架下,采用Processing的SimpleOpenNI庫來進(jìn)行對(duì)物體的三維點(diǎn)云數(shù)據(jù)的獲取。而所有的三維點(diǎn)云數(shù)據(jù)都是在Kinect的深度圖像中獲取,Kinect的深度圖像是由其自帶的紅外投影機(jī)和紅外攝像頭配合獲取而得,如圖1所示。
圖1 Kinect深度流數(shù)值
獲取到得每個(gè)像素點(diǎn)數(shù)據(jù)都是一個(gè)為兩個(gè)字節(jié)的數(shù)據(jù),即共16 bit數(shù)據(jù),其中前13個(gè)bit就是每個(gè)像素的深度值。在空間坐標(biāo)(x,y,z)中,所獲取的深度圖平面坐標(biāo)(x,y)以目標(biāo)位置為參考平面,z代表Kinect傳感器與物體目標(biāo)的距離(即圖中的攝像頭與物體的深度),如圖2所示。
圖2 Kinect深度數(shù)據(jù)流
利用Kinect獲取深度圖像數(shù)據(jù)過程中,由于自身信號(hào)傳輸和環(huán)境因素的干擾,不可避免地會(huì)出現(xiàn)一定的噪聲。這會(huì)影響到后續(xù)三維重建的計(jì)算過程,因此需要對(duì)獲得的深度數(shù)據(jù)進(jìn)行濾波處理。本文采用的是雙邊濾波算法[10],其是高斯濾波算法的改進(jìn)算法,特點(diǎn)是采用灰度域權(quán)值和空間域權(quán)值優(yōu)化圖像邊緣數(shù)據(jù)。對(duì)深度圖像D中的點(diǎn)p(x,y)計(jì)算方法如下:
(1)
(2)
式中:q是點(diǎn)p領(lǐng)域中的點(diǎn),δs2和δr2為灰度域權(quán)值和深度域權(quán)值。
通過OpenNI的坐標(biāo)轉(zhuǎn)移技術(shù),提高掃描獲取光滑的三維點(diǎn)云數(shù)據(jù)。如圖3所示。
圖3 通過程序改變掃描角度獲得點(diǎn)云數(shù)據(jù)
通過上述方法獲取三維點(diǎn)云數(shù)據(jù)后,盡管在屏幕上顯示的是連續(xù)的圖像,但這技術(shù)還是不具備能夠?qū)D像打印成物理所需的數(shù)據(jù)結(jié)構(gòu)。點(diǎn)云數(shù)據(jù)中的點(diǎn)定位在3D空間中,但它們并不是以描述一個(gè)可以打印的實(shí)際表面。為了能構(gòu)建一個(gè)表面,就必須對(duì)所有的點(diǎn)云數(shù)據(jù)進(jìn)行構(gòu)建網(wǎng)格生成表面。
用迭代最近點(diǎn)算法ICP(Iterative closest point)[11]來構(gòu)建三角形網(wǎng)格。Kinect在開始掃描的時(shí)候,從一個(gè)單獨(dú)的深度點(diǎn)的索引開始,然后計(jì)算如何將這個(gè)點(diǎn)與鄰近的點(diǎn)連接起來,形成能添加至網(wǎng)格的三角形。如圖4所示。
圖4 三角形索引點(diǎn)圖
在一個(gè)每行4個(gè)共3行的深度點(diǎn)中,由于Kinect獲取的深度點(diǎn)云并不是整齊排列在行中的,而是根據(jù)落在物體表面的區(qū)域而輕微分散的。如圖4所示,黑色點(diǎn)表示當(dāng)前點(diǎn),用羅盤的方法來命名各個(gè)角:NW為當(dāng)前點(diǎn),它將構(gòu)成左上角,NE為右上角,而SW和SE為下面兩個(gè)?,F(xiàn)在要計(jì)算這四個(gè)角的索引i(即搜索編號(hào)),第一個(gè)點(diǎn)NW比較簡單,利用式(3),將深度點(diǎn)的x-y位置變換為索引;其他3個(gè)點(diǎn)分別在x軸和y軸上有s行的位移,即NE點(diǎn)的索引為(x+s)+y×640,SW點(diǎn)為x+(y+s)×640,SE點(diǎn)為(x+s)+(y+s)×640。
i=y×640+x
(3)
計(jì)算出4個(gè)點(diǎn)的索引后,根據(jù)右手準(zhǔn)則增加頂點(diǎn),這樣就可把這4個(gè)點(diǎn)定義的平面分割成兩個(gè)三角形:分別是NW到NE到SW和NE到SE到SW,如圖5所示。
圖5 三角形網(wǎng)格的構(gòu)成圖
為了得到每一個(gè)點(diǎn)的位置,就必須要計(jì)算它們在深度點(diǎn)數(shù)組中的索引。當(dāng)前點(diǎn)完成索引工作后,就從NE點(diǎn)開始,NE是緊挨著當(dāng)前點(diǎn)右側(cè)的點(diǎn),為了能找到它的索引,就要在當(dāng)前點(diǎn)的索引上增加一個(gè)變量r,從而來計(jì)算當(dāng)前行下一個(gè)位置的深度點(diǎn)。其中SW是開始點(diǎn)的下一行,在構(gòu)建網(wǎng)格過程中,如果要用到所有行的深度點(diǎn),那只需要每次都下移一行,但是,為了加快掃描的速度,采用減少掃描密度的方法,隨機(jī)跳過一些行。當(dāng)跳過一些行后,為了能重新找到索引點(diǎn),這里就用變量r來判斷,當(dāng)算出SW的索引后,那么SE也就自然簡單可以計(jì)算而得。
通過如此的方法得到平面的三角形,應(yīng)用到3D幾何中也是類似的方法,三角形本身就是3D幾何的基本原子單元。通過把Kinect獲取的深度點(diǎn)連接成一個(gè)平滑的表面,如圖6所示。如在150像素的立方體上的兩個(gè)面,把每個(gè)面拆分成兩個(gè)三角形,每一個(gè)三角形連接都是由組成面的四個(gè)點(diǎn)中的三個(gè)點(diǎn)組成,而每個(gè)點(diǎn)最終都屬于多個(gè)三角形。
圖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)建的時(shí)候出現(xiàn)的錯(cuò)誤,如果將圖進(jìn)行拉伸,所有的表面還是可以看到,只是背景前后錯(cuò)位。
圖7 背景前后錯(cuò)層圖
在構(gòu)建網(wǎng)格中,采用的是迭代鄰近點(diǎn)的方法,但是在Kinect的深度圖中是有很多孔洞的,而根據(jù)深度圖生成原理中,這些孔洞的坐標(biāo)都是(0,0,0),當(dāng)去迭代這些點(diǎn)時(shí)就會(huì)導(dǎo)致背景和物體的錯(cuò)位。對(duì)于一個(gè)可打印的3D模型,它必須是無縫的,即需要一個(gè)連續(xù)的立體表面,所有的法線必須朝向外側(cè)。
計(jì)算法線的方法可以非常簡單,如對(duì)每一個(gè)點(diǎn),取和它相鄰的兩個(gè)點(diǎn)組成三角形,計(jì)算三角形的法向即為該點(diǎn)的法向。但是這種方法很不精確,其中有一個(gè)點(diǎn)的坐標(biāo)稍有變化,就會(huì)影響最終法線的方向。
要解決這個(gè)問題,采用的方法是考慮一個(gè)點(diǎn)周邊的所有的點(diǎn),使用最小二乘法來擬合一個(gè)最佳平面,這個(gè)平面的法向即為該點(diǎn)的法向[12]。首先要計(jì)算該點(diǎn)以及周邊的所有點(diǎn)到這個(gè)平面的距離之平方和最小:
(4)
式中:M為所有點(diǎn)到平面的距離平方和,a、b、c是決定這個(gè)平面的參數(shù),也就是這個(gè)平面的法矢量(a,b,c)。x、y、z是該點(diǎn)的坐標(biāo),為了求出合適的a、b、c值,對(duì)三個(gè)變量分別求偏導(dǎo):
(5)
(6)
(7)
通過公式計(jì)算出a、b、c值,即可得到該面的法向。在Kinect獲取到深度圖像數(shù)據(jù)后,通過上述方法進(jìn)行修復(fù)處理。修復(fù)結(jié)果如圖8所示。
圖8 錯(cuò)層修復(fù)圖
在進(jìn)行修復(fù)處理后,已經(jīng)將三維表面連接成面了,但由于構(gòu)建網(wǎng)格是三角形網(wǎng)格,即表面都是三角形,這樣導(dǎo)出模型的表面相對(duì)粗糙。為了能快速地生成打印格式文件,本文通過微軟的3D builder軟件進(jìn)行一鍵手動(dòng)修復(fù)表面,修復(fù)的過程中也能調(diào)整好打印所需的切片文件,如圖9所示。
圖9 表面光滑處理圖
通過上述處理后,就可以得到進(jìn)行3D打印前的模型文件,導(dǎo)出成stl格式后完成打印工作。
上述Kinect的三維重建技術(shù)結(jié)合3D打印技術(shù)在輔助教學(xué)方向具有重要的應(yīng)用價(jià)值,以下以立體幾何結(jié)構(gòu)輔助教學(xué)應(yīng)用為例。立體幾何結(jié)構(gòu)的學(xué)習(xí)在機(jī)械結(jié)構(gòu)設(shè)計(jì)和產(chǎn)品結(jié)構(gòu)設(shè)計(jì)中都起著至關(guān)重要的作用。但是在教學(xué)過程中,如果沒有用具體的結(jié)構(gòu)實(shí)物來講解,學(xué)生往往很難靠想象來記住復(fù)雜的結(jié)構(gòu),特別是多結(jié)構(gòu)體的相互穿插,產(chǎn)生的交插截面是很難想象出來的,只靠講解和平面圖是較難理解和掌握。
如果應(yīng)用本文所講述的技術(shù),即利用Kinect對(duì)多個(gè)幾何結(jié)構(gòu)物體進(jìn)行分別掃描重建,通過微軟開發(fā)的3D builder軟件對(duì)多個(gè)三維幾何圖形進(jìn)行組合,通過3D打印機(jī)打印出組合模型,這樣就可從實(shí)物上一目了然地看到新物體的結(jié)構(gòu),從而達(dá)到輔助教學(xué)的目的。而且,對(duì)比傳統(tǒng)的KinectFusion的應(yīng)用方法,其優(yōu)勢非常明顯,整個(gè)掃描、建模到打印過程快速簡單、效率高、對(duì)硬件的要求低,一般的教學(xué)設(shè)備即可滿足。具體的實(shí)現(xiàn)流程如圖10所示。
本實(shí)驗(yàn)具體以兩把不同椅子組合模型為例。兩把椅子結(jié)構(gòu)融合交錯(cuò),如果沒有結(jié)構(gòu)實(shí)體,很難想象出各個(gè)交錯(cuò)截面的結(jié)構(gòu)樣式。因此使用上述方法,可以通過得到的實(shí)物,清晰地從不同角度和深度來體現(xiàn)。根據(jù)上述流程圖,首先通過Kinect的紅外攝像頭和紅外投影儀來分別獲取兩把椅子的深度圖像。對(duì)于獲取到的深度圖像,在程序中,可以直接得到每個(gè)像素點(diǎn)的三維數(shù)據(jù),并可通過坐標(biāo)轉(zhuǎn)換實(shí)現(xiàn)各個(gè)位置的點(diǎn)云數(shù)據(jù),如圖11所示。
圖11 兩把椅子的點(diǎn)云數(shù)據(jù)圖
對(duì)于調(diào)整好角度的點(diǎn)云數(shù)據(jù),利用迭代最近點(diǎn)算法(ICP)進(jìn)行三角形網(wǎng)格構(gòu)建,從而融合所有點(diǎn)云實(shí)現(xiàn)三維重建,用3D builder打開,如圖12所示。
圖12 3Dbuilder椅子模型效果圖
為了避免導(dǎo)出三維模型數(shù)據(jù)的背景與物體前后交錯(cuò)的現(xiàn)象,采用網(wǎng)格修正算法對(duì)所有的點(diǎn)云數(shù)據(jù)進(jìn)行修正。利用Processing的ModelBuilder庫進(jìn)行STL文件的導(dǎo)出,再利用微軟的3D builder軟件進(jìn)行修復(fù)重組,如圖13所示。
圖13 3Dbuilder修復(fù)重組模型效果圖
對(duì)得到的STL文件模型利用桌面3D打印機(jī)進(jìn)行實(shí)體模型打印。打印結(jié)果如圖14所示。
圖14 實(shí)體打印模型
通過該實(shí)驗(yàn)證明,在輔助教學(xué)中對(duì)復(fù)雜的結(jié)構(gòu)拼接和結(jié)構(gòu)教學(xué)都帶來更為直觀的呈現(xiàn),這樣就可以摒棄傳統(tǒng)教學(xué)中靠想象和平面圖示的抽象認(rèn)知。
本文利用Kinect三維重建技術(shù)結(jié)合3D打印技術(shù)研究在輔助教育領(lǐng)域的價(jià)值,采用Kinect的多深度圖像融合算法,通過微軟的3D builder平臺(tái)進(jìn)行優(yōu)化,基于桌面3D打印機(jī)實(shí)現(xiàn)實(shí)物模型輸出。在實(shí)驗(yàn)中,本文是基于OpenNI框架,使用Processing的SimpleOpenNI庫進(jìn)行3D點(diǎn)云數(shù)據(jù)掃描,并用ModelBuilder庫進(jìn)行網(wǎng)格構(gòu)建輸出三維模型STL文件,根據(jù)上述實(shí)驗(yàn)所得的組合實(shí)體模型,可以直觀地看出其幾何結(jié)構(gòu)穿插部分的輪廓,在輔助教育中帶來更為直觀正確的教學(xué)。這種快速的建模方法在其他領(lǐng)域也有很多快速高效的優(yōu)勢。