徐海濤,譚兆湛
(華南理工大學 廣州學院,廣州 510800)
三維掃描是集光、機、電和計算機技術于一體的技術,主要用于對物體空間外形和結構及色彩進行掃描,以獲得物體表面的空間坐標。它能夠將實物的立體信息轉換為計算機能直接處理的數字信號,為實物數字化提供了相當方便快捷的手段。
利用Kinect 進行掃描,會有一個可見面和一個隱藏面。假設有一個點P 在隱藏面,其空間坐標是P(x,y,z),如圖1。

圖1
我們需要通過不同方向的拍照來重建整個物體,并在同一個空間坐標系中獲得全部點來確定這個物體。因此,讓平臺旋轉一定角度α,使得P 點對Kinect 可見。在前一次的拍照中,點P 確定于其坐標P(x,y,z)。當平臺旋轉后,P 的坐標相應發生變化變成P(x′,y′,z′)。如果知道平臺相對于前一次拍照旋轉的角度,可以通過基本的三角關系容易由P(x′,y′,z′)計算出原來坐標中P 點的坐標。如果平臺繞Y 軸的旋轉角度為α,可得到如下轉換方程:


圖2

圖3 電路圖
旋轉平臺的設計是利用齒輪傳動來實現,如圖2。右邊的小齒輪連接舵機,帶動中間的大齒輪轉動,傳動比為5∶1。左邊小齒輪是連接電位器的,用來輸出角度信息,系統采用arduino 單片機進行控制,電路如圖3。
舵機的控制程序如下:

角度控制程序如下:

從Processing 中讀回當前角度信息,利用map()函數把角度信息轉換為舵機的目標角度。
在Processing 中,定義變量shotNumber,如下:
float[]shotNumber=new float[3];
shotNumber 用要定義拍照的次數,這里我們讓物體
每轉120°拍照一次,因此定義為3,程序如下:

利用Processing 輸出“*.ply”格式的點云數據。首先,輸出“ply”作為開頭,然后標注所輸出的“ply”格式的類型(ascii 或二進制),再以“comment”為開始為文件添加注釋,如下:

接著輸出點云的個數,以及它們的特征。這里,我們輸出的是每個點的坐標與顏色。因此聲明六個特征變量:x、y、z、red、green、blue,最后結束聲明,如下:


執行Processing 程序后,得到物體每個點的坐標與顏色特征數據:

得到物體的點云數據后,利用Meshlab 對點云進行網格化,重建物體的三維模型,并生成相應格式的三維模型文件“*.ply”,如圖4。

圖4
本文介紹了旋轉式三維掃描器的設計,是利用Arduino 控制平臺的旋轉,利用Kinect 傳感器對旋轉平臺上的物體表面進行掃描,并用Processing 輸出物體的空間坐標數據,再通過MeshLab 重建曲面,輸出一定格式的三維模型文件,如“*.ply”或“*.stl”直接用以三維打印、或供其他CAD 軟件使用。
[1] MELGARER. Arduino and Kinect Projects[M].Apress.Apr 2012.
[2] 余濤.Kinect 應用開發實戰:用最自然的方式與機器對話[M].北京:機械工業出版社,2013.