張志林 苗蘭芳
(浙江師范大學數理與信息工程學院 浙江 金華 321004)
傳統的三維重建主要由以下三個步驟構成:獲取數據并處理、點云配準以及曲面重建。已有大量的研究使用Kinect v1進行三維重建[2-4]?,F階段最為突出的是微軟團隊的Newcombe等提出Kinect Fusion[5]算法,其利用Kinect v1可以對任意的室內場景的任意光照條件下進行重建。文獻[6-9]將Kinect Fusion算法擴展到適用于更大場景的重建,但是由于受到三維立方體的限制整個場景的重建范圍很有限,沒有對單個物體提取出來進行重建的模塊。周瑾等[10]使用ICP算法尋找輸入點云與可變人體模型之間的對應點對,使用可變形的人體模型來擬合采樣點云,然后迭代獲取具有高精度的人體三維模型。但是此方法只能用于重建人體,局限性很大。宮鈺嵩等[11]使用Kinect獲取不完整的點云數據,利用網絡上已經存在的同類三維模型為參考進行三維重建。但是此方法依賴網絡資源,限制了重建物體種類,且還原度低。李詩銳等[12]利用光滑表面作為物理表面平滑程度的先驗知識,修正后面數據流的噪聲,解決了累積誤差問題,并且基于Kinect v2實現了一套三維重建系統,該系統可以實時、精確地重建物體和場景。但是此方法是在KinectFusion上進行改進,依然沒有脫離全局立方體對重建范圍的限制。
本文在設計基于Kinect v2三維物體重建系統時,主要分為三個模塊:獲取點云,點云拼接,物體重建。本文三維重建系統適合做離線的點云處理,不具有實時性。本系統的貢獻主要有:第一,通過分析Kinect獲取點云的噪聲分布特點,將所要提取的物體點云放在較高精度的范圍內,通過設計一種包圍盒來獲取高質量的物體點云,添加了物體點云獲取模塊的設計方案。第二,將粗配準的SAC-IA[13]和細配準的ICP[14]算法擴展到多片點云,并且設計一種可以從兩邊向中間逼近的點云配準策略,可以很好地消除累積誤差。第三,實現了一套完整的使用Kinect v2的三維物體重建系統。實驗表明,該系統具有重建精度高、操作方便且設備要求低等優點。
在使用Kinect v2獲取三維點云之前,需要對Kinect v2進行標定。現階段被廣泛地應用于相機標定的方法是張正友標定法[15]。文獻[16]通過對比標定前和標定后的深度圖像,發現誤差很小,表明Kinect v2的內部芯片已經嵌入了對彩色攝像頭和紅外攝像頭進行標定的程序。本文使用Kinect API中的MapDepthPointTo CameraSpace( )函數直接將深度圖像轉換為三維點云。所以本文并沒有對Kinect v2進行額外的標定。圖1獲取的是展示臺上放一把椅子的場景點云,可以看出最左邊的墻體和邊緣出現了大量的噪聲和凸起的情況,采樣效果很差。這是由于點到平面距離的標準方差x(mm)與傳感器到平面的距離y(m)成如下線性關系[12]。
y=0.547 2x+1.258
(1)
式(1)表明在Kinect v2的有效范圍內(0.5米到5.0米)隨著傳感器到平面距離的增大,采樣點云邊緣處的殘差也隨之增大。本文將Kinect v2與所要重建的物體的距離d設置為1米,Kinect v2正對著所要重建物體,即中心位置。這樣可以保證所要重建物體的點云盡量精確且不會由于個別點沒有深度數據而產生空洞。

圖1 包含目標物體的場景點云
從圖1可以看出,目標物體點云包含在獲取的場景點云中,需要將目標物體點云從整個場景中提取出來。所采樣的是具有x、y、z坐標信息的點云。要想分離出這個椅子,需要保證這個椅子的三維坐標與所在場景及地面、三面墻體和天花板沒有交集。本文通過設計一種三維包圍盒來分離目標物體點云。具體是使用x、y、z三個方向的直通濾波器將椅子周圍的點云過濾出去,得到只包含椅子的點云。在本文中在x、y、z三個方向上的直通濾波器取值范圍為:
-0.8≤x≤0.8
-0.61≤y≤0.8
1.4≤z≤2.5
(2)
分離結果如圖2所示,圖2(a)是在初始位置分離出的點云,圖2(b)是椅子旋轉一定角度后分離出的點云。本文需要使用Kinect v2采集椅子360°全方位的點云。為了使得實驗便于操作,本文使用物體繞中心自轉360°來代替Kinect v2圍繞物體旋轉360°獲取不同角度的點云。x的坐標范圍要適當的大一點,因為其在旋轉過程中x的最大值是椅子點云長和寬的對角線長度。

圖2 處理之后的點云
從圖2(a)中可以看出在實際應用中由于受到視線遮擋、障礙物等因素的影響,點云數據中往往存在著一些離群點,這些離群點會使重建物體產生毛刺,降低還原度。本文使用PCL點云庫中的去除離群點的濾波器來進行處理,效果如圖2(c)所示,由于篇幅原因去除離群點的原理不再展開論述。
本節中點云配準分為三步,第一步是對兩片點云進行粗配準,使得兩片點云中公共部分盡量重合,減少ICP算法的迭代次數。本文使用采樣一致性初始配準算法(Sample Consensus Initial Alignment, SAC-IA)進行粗配準。第二步利用經典的ICP算法將已經具有較好位置的兩片點云進行細配準。第三步設計一種可以減小累積誤差從兩邊逼近的適合多片點云的配準算法,從而獲得一個完整的全方位的物體點云。
采樣一致性初始配準算法(Sample Consensus Initial Alignment, SAC-IA)依賴特征直方圖,所以需要先計算點云的快速特征點直方圖描述器(FPFH)[17],假設待配準點云記為P,目標點云記為Q。算法一般流程如下:
1) 從P中選擇n個采樣點,兩個相鄰采樣點之間的距離需要大于之前設定好的最小距離閾值d使得采樣點具有不同的FPFH特征。
2) 在Q中尋找和P中采樣點具有相似FPFH特征的點,當不止一個點時,就在這些點中隨機挑選一個點作為P在Q中的對應點。
3) 計算這兩片點云對應點之間剛體變換矩陣,使用變換后的距離誤差和函數的大小作為當前配準變換后性能優劣的標準。距離誤差和函數使用Huber罰函數表示,記為:
(3)
式中:
(4)
式(4)中ml為之前設定好的閾值,第i組對應點變換之后的距離差為li。當誤差函數的值達到最小時,此時的配準變換矩陣[18]就是最優解。最后將P通過矩陣變換得到配準結果。具體流程如圖3所示。

圖3 SAC-IA 算法流程圖
ICP算法將兩個來自不同坐標系具有重疊部分的三維數據點集,通過迭代求解出兩個點集之間的剛體變換矩陣來進行配準。迭代最近點算法的基本思想是:已知兩個對應點集合為:
X={x1,x2,…,xn}
(5)
P={p1,p2,…,pn}
(6)
求解:旋轉矩陣R和平移向量t,目標函數為:
(7)
算法流程概括如下:
1) 在點集P中尋找與點集X中的對應點:
y={y1,y2,…,yn}
(8)
2) 求解:旋轉矩陣R和平移向量t,其目標函數為:
(9)
3) 更新點云模型:
(10)
4) 計算兩個對應點集之間的距離:
(11)
5) 若dk+1 圖4 ICP算法流程圖 無論是采樣一致性初始配準算法還是ICP算法都是針對兩片點云進行配準的,一個作為目標點云,一個作為待配準點云,通過計算一個剛體變換矩陣使得待配準點云盡可能地和目標點云重合。在物體重建的過程中不可能通過兩片配準的點云來刻畫整個物體所有的三維結構,因此本節將討論如何將多片不同角度的點云進行拼接,并且設計一種可以消除累積誤差的多片點云配準算法。如圖5所示,將Kinect v2固定在椅子一米左右的正前方,然后將椅子繞圓心進行自轉。每自轉1/24圓的時候用Kinect v2采集一幀深度圖像,轉換為點云。記第一片即初始位置的點云為p1,第二片為p2,以此類推可以得到p3,…,p24,繞完一周之后可知點云p1和p24為同一個位置即初始位置上的相同點云。 圖5 點云采集示意圖 將多片點云進行配準時,由于點云采集誤差,人為和所用算法的原因,多次兩兩配準時,會產生累積誤差,使點云配準的精度隨著點云數目的增多而逐漸降低,使得重建的模型沒有很好的還原度。本文提出一種從兩邊向中間進行逼近的適合多片點云的配準算法。其主要思想如下: 將所采集的點云p1,p2,…,p24依次存入元素為PointXYZ的數組中。全局點云初始值psum為p1,p1為待配準點云,p2為目標點云,通過SAC-IA進行粗配準獲得良好的初始位置,再利用ICP算法計算相鄰兩片點云即p1與p2的剛體變換矩陣H1。當全局點云psum經過p1與p2的變換矩陣H1時psum被移動到p2的位置上。psum更新為p1與p2的和,接著對psum進行降采樣除去重疊部分的點云減少重影。以此類推,再用同樣的方法將psum移動到p3,p4,…的位置上,當psum移動到p24的位置上時,即完成所有24片點云的配準,此時psum為一個完整的物體點云。使用這種方法,雖然一開始p1和p24在同一位置上,但是隨著誤差的累加,p1慢慢偏離初始位置,使其不能與p24完全重合,出現不能閉環的現象。由于無論是從軌跡圓的左邊開始還是從右邊開始,最終的目的位置都是一致的。在之前的算法中并沒有利用這一特性,導累積致誤差增大,在一些精細的物體進行重建時尤為明顯。本文使用從兩邊向中間逼近的方法來減少累積誤差。計算數組的中間值下標mid,設置一個容錯尺度t。左邊數組的長度sizeA為mid+t,右邊數組的長度sizeB為mid-t,通過在中間值的左邊和右邊多拼接幾片點云,來增加物體的重疊范圍,達到閉環的目的。從pmid+t和pmid-t分別向終點位置p1和p24進行逼近,最后再將左右兩邊總的點云psumA和psumB相加即得到整個psum的點云模型,算法流程圖如圖6所示。 圖6 多片點云配準流程圖 Kinect v2對平臺的要求如下,Win8/ Win8.1操作系統, Visual Studio 2012以上軟件開發平臺,顯卡支持DX11,內置USB 3.0,4 GB以上內存,64位的CPU,i7,2.5 GHz以上更佳。本文系統構建的環境是,Win 8.1/Visual Studio 2013/AMD RADEON R9 M290X/ USB3.0/8 GB/i5-4690 3.5 GHz。 本系統使用C++程序開發語言,利用Kinect v2內置接口獲取點云數據,以及PCL1.8.0版本[18]的點云庫對點云數據進行處理。以上都需要在Visual Studio 2013的開發環境下進行編譯使用。為了使重建效果更好地表現出來,本文使用MeshLab2016對配準好的點云進行曲面重建。 本文重建的物體為一個高約80 cm,長約55 cm,寬約45 cm的靠椅。如圖7(a)所示是左半部分psumA的點云配準效果圖,右邊的扶手和椅子腿沒有重建完整,點云較為稀疏。圖7(b)是右半部分psumB的點云配準效果圖,左邊的扶手和椅子腿有所缺失。圖7(c)是左右兩邊進行相加之后psum的點云結果,可以看到椅子已經完整地配準好。圖7(d)是使用本文算法的椅子重建效果的細節圖,可以看到椅子背部的曲線,輪廓幾乎一致的,沒有出現重影現象。圖7(e)是僅僅使用ICP算法將多片點云依次疊加進行配準的椅子局部效果圖,可以看到椅子的背部并沒有被完全配準。由于誤差的累積,之后的點云與初始點云的偏差越來越大,導致后面的點云配準的效果越來越差。為了驗證本文算法的一般性,本文選擇了一個精細的高約29 cm,肩寬約20 cm完全純白的大衛石膏頭像。由于石膏頭像具有以下兩個特點:(1) 體積較小,面部精細,頭發的部分特征相似且重復性較高。(2) Kinect v2本身采樣的分辨率較低,對面部細節刻畫較為模糊。這些都給石膏頭像點云配準增加了難度,更容易比較出本文算法在點云配準效果的優越性。本文將大衛頭像每次旋轉10°采集一次場景點云,然后設計三維包圍盒將石膏頭像點云從場景中分離出來。當石膏頭像旋轉一周之后,將得到36片不同角度的大衛石膏頭像點云,圖7(f)是使用傳統的ICP算法進行配準的效果圖??梢钥吹郊绮亢捅巢刊B加在一起,當配準到第6片點云時由于psum誤差累積過多ICP算法完全失效,導致整個石膏頭像配準失敗。圖7(g)是使用本文算法所配準好的石膏頭像點云??梢钥闯?,石膏頭像面部輪廓較為明顯和清晰,石膏頭像的肩部平滑,輪廓清晰。由此可以得出本文算法比傳統的ICP算法進行疊加配準物體的準確度更高。為了使得物體的還原度更好,本文使用MeshLab來對物體點云進行實體顯示。圖7(h)、圖7(i)為使用本文算法對椅子點云和石膏頭像點云在MeshLab中進行曲面重建的效果圖??梢钥闯觯疚乃亟ǖ奈矬w具有一般性,且重建的物體還原度高。 圖7 物體重建效果圖 通過分析Kinect獲取點云的成像特點,將所要提取的物體點云放在采樣精度高的范圍內,獲取高質量的物體點云,增加了物體點云獲取模塊的設計方案。本文著重提出一種適用于多片點云的配準算法,該算法策略配準精度高、適用性好。本文的系統適用于各種物體的重建,不受到三維立方體約束,重建物體的體積不受限制且還原度高。下一步的工作重點將使用GPU加速,實現一種實時三維重建系統。
3.3 多片點云配準


4 Kinect v2物體重建系統



5 結 語