徐曦
(四川電影電視學院,四川 大邑611331)
三維重建又稱為三維重構,是通過特定設備,獲取目標物體和目標場景的信息,并建立對應三維模型的過程。傳統的三維模型獲取過程一般都是通過人力,在3DMAX 以及MAYA 等建模軟件中手工創建,三維重建課題就擔負了將人力解放出來的責任,其目標就是通過使數據采集設備以及相關計算機軟件算法完成模型的創建過程。在數據采集階段,所使用的設備獲取原始數據的方式決定了三維重建的過程與方法。設備獲取原始數據的手段大致有兩種:(1)通過光學相機獲取彩色或者灰度圖像。(2)通過激光或者結構光獲取深度數據或點云。而圖像信息、深度與點云信息是這兩種手段所對應的原始數據。本文實驗中使用的Kinect 設備即屬于采用不可見的結構光數據采集方式。
Kinect 的內部結構包括:用于獲取彩色圖像的彩色攝像頭,紅外發射器與紅外接收機,發射器將一組經過調制的紅外點陣投射在目標物體上,當點陣反射回來后被接收器接收,由于物體各表面到接收器的距離不同,反射回來的點陣的疏密程度也不同,通過點之間的距離并結合三角測量法,就可以得出深度信息
由于Kinect 自身并不能自動生成點云圖像,筆者使用的點云數據是由Kinect 的紅外深度攝像頭和彩色攝像頭分別獲取的深度圖像與彩色圖像融合而成。
首先,需要獲取深度數據,并將深度數據轉換為灰度圖像,以便于使用OpenCV 進行顯示與觀察。Kinect 使用一個16 位的二進制數表示深度,轉化為整數后,數值越大離攝像機就越遠,也可將其表示為8 位的256 灰度級圖像。
其次,要獲取彩色數據,Kinect 獲取的彩色圖像為1280*960,由于是RGB 圖像,每個通道占據8 位,Alpha 通道占據8 位,形成了32 位真彩色圖像,因此數據量較大,需要減小數據量。同時,為了能夠更好的跟Kinect 捕捉到的分辨率為640*480 的深度圖像進行配準,所以筆者將彩色圖像的分辨率也設定為640*480。另外要注意的是由于彩色圖像每個像素有3個分量,所以在將彩色數據流轉換到數組中時,需要整合。
在得到所需的兩幅圖像以后,就可以通過交叉調用OpenCV 與KinectSDK 中的相關函數,將之前得到的深度數據與彩色數據存儲在OpenCV 的圖像數據中。然后使用PCL(Point Cloud Library)生成一個空數據結構,該數據結構與兩幅圖像大小相等,然后在程序中使用一個簡單的循環結構,遍歷每一個像素點,并利用深度數據為其匹配在三維空間中的對應點,然后再將彩色圖像中的對應RGB 信息融合進來,最后將結果填充至前述的PCL 空數據結構中,即形成了彩色點云數據,至此已將兩幅圖像合成為一幅擁有三維信息的彩色點云目標場景圖像。
為了后續重建,有必要將已經獲取的目標物體點云從整個場景的點云中提取出來,并濾除噪點。
我們要實現四個步驟:
第一,提取(分割)目標物體點云。使用隨機采樣一致性算法Random sample consensus(RANSAC)從點云中提取平面。其思想為:空間中同屬一個平面的點在數學上都應該滿足平面的參數方程:
ax+by+cz+d=0
此時,通過分區域隨機采樣方法,結合坐標可以計算出場景中點的法線,進而通過各個點的法線估算出平面的法線,也就得到了a,b,c。
第二,濾除提取結果中的離群點,采用統計濾波方法,該方法雖然用于傳統圖像處理,但其思想也可用于點云的統計濾波。設X 為點云中每個點到其自身臨近點的平均距離,且X~N(μ,δ2),其中μ 為全局均值,而δ2為全局方差。當某個點的Xi 大于以方差為基準的某個閾值時,則被視為離群點并予以剔除。
第三,物體姿態校正,由于在獲取數據過程中,Kinect 有一定的傾斜角,最后的點云在相機坐標系中也會傾斜,需要將其轉換到世界坐標系。因此可以通過向量的點積運算找出相機的傾斜角度,將其表示為矩陣R,并通過乘以R-1 來將物體校正到與世界坐標系的z 軸平行。此時物體在屏幕上正對觀察視角,利于我們后續的處理。
第四,缺失面彌補。缺失平面的彌補有多種方法,沒有統一標準。筆者選擇在云臺上旋轉物體,拍攝物體不同側面的多個幀,然后采用傳統圖像拼接中的方法,將物體從這些幀中提取出來,根據旋轉角度進行拼接。
首先,進行點云平滑操作,該算法采用了移動最小二乘法MLS(Moving Least Square)。
其次,通過有效的下采樣算法可以削減點云的數量,且不改變目標物體的拓撲結構。這一目標可以通過八叉樹技術實現,原理是:將點云空間劃分到不同的八叉樹節點,每個節點都是一個體素(Voxel)。此時整個空間就形成了一個體素網格(VoxelGrid)。用每個體素的中心點來替代該體素內的所有其他點,那么整個點云的數量將大幅減少。
最后,重構階段采用泊松算法,該算法由Michael Kazhdan,Matthew Bolitho,and Hugues Hoppe 聯合提出。求泊松方程的最優解就代表了重建過程,與其他算法不同的是泊松算法求出的是全局解而非局部解。它將物體內部的點視為0,外部點為1,物體表面的點視為有向點并指向內部。因此梯度有變化的點就是表面上的點,沒有變化的則是其他點。整個物體的表面形成了一個梯度場。此時將點云數據集穿過一個平面,平面上的截痕成為判斷點與曲面之間關系的依據。同時可以在不同尺度下解泊松方程,使得曲面可以由粗到細逐漸向物體的表面收斂。