摘 要:三維激光掃描儀獲取的散亂點云數據的可視化工作,是對點云數據進行分析應用的一個重要環節。該文從開發環境配置、點云數據輸入、點云數據顯示等方面詳細討論了可視化的實現細節,利用VC6 + OpenGL實現了點云顯示、旋轉、平移、縮放、渲染等功能,為點云數據的后續處理提供了直觀的幫助。
關鍵詞:三維激光掃描 點云數據 可視化 OpenGL
中圖分類號:TP391 文獻標識碼:A 文章編號:1674-098X(2013)04(a)-00-02
三維激光掃描技術是一種先進的全自動高精度立體掃描技術,可以深入到復雜現場環境中采集大量的點云數據,從而滿足精確建模的要求,并能利用采集的點云數據快速重建出原實體的三維模型,方便用戶從中提取三維點、線、面、體等各種數據,廣泛應用于逆向工程、測繪、虛擬仿真等不同領域。三維激光掃描技術因為其獲取速度快、精度高、實時性強、全數字化等特點,并且能夠制作形式多樣的數字產品等突出優勢,近年來已逐漸成為各領域的研究熱點。可以說三維激光掃描技術為我們提供了高科技的數據獲取工具,其廣闊的應用前景需要科技工作者進一步探索、發現。將三維激光掃描儀獲得的散亂點云數據進行可視化,是對點云數據進行分析應用的一個重要環節。該文將從開發環境配置、點云數據輸入、點云數據顯示等方面詳細討論可視化的實現細節。
1 開發環境配置
該文以VC6為開發工具,但VC6并不能直接繪制并顯示三維坐標點,當前常用的處理方法是借助OpenGL來實現三維點坐標的繪制與顯示工作。為了能在計算機上順利地顯示出點云圖像,首先需要對VC6進行OpenGL的安裝與配置。
1.1 OpenGL介紹
OpenGL是一個開放的三維圖形軟件包,獨立于窗口系統和操作系統,以它為基礎開發的應用程序可以方便地在各種平臺間移植。OpenGL可以與Visual C++緊密接口,可保證算法的正確性和可靠性。OpenGL使用簡便,效率高,具有七大功能:提供基本的點、線、多邊形、復雜的三維物體(球、錐、多面體等)、復雜曲線和曲面建模功能;提供基本變換和投影變換功能;提供RGBA模式和顏色索引兩種顏色模式;具有光照和材質設置功能;提供紋理映射功能;提供位圖顯示和圖像增強技術;雙緩存動畫技術。
在三維散亂點云可視化過程中,首先會使用OpenGL進行三維坐標點顯示,其次會根據一定的算法提取點云的特征點,利用點云三角格網化[1-3]等技術實現三維實體的重構并借助OpenGL調整光照、增加紋理,以更加逼真地顯示三維實體。
1.2 OpenGL庫配置文件
用戶首先需要從OpenGL官方網站http://www.opengl.org下載OpenGL庫文件,下載完成后解壓得到文件包,OpenGL庫配置用到的文件分為三類:①頭文件:gl.h、glaux.h、glu.h、glut.h;②動態鏈接庫文件:glaux.dll、glu32.dll、glut32.dll、opengl32.dll;③靜態庫文件:glaux.lib、glu32.lib、glut32.lib、opengl32.lib。
1.3 Windows下配置OpenGL
假設用戶計算機上操作系統(32位)安裝在C盤,VC 6安裝到C:/Program Files/Microsoft Visual Studio目錄下。將1.2中的頭文件,全部拷貝到C:/Program Files/Microsoft Visual Studio/VC98/Include/GL目錄下(如果沒有GL目錄的話,可自行創建);將1.2中的動態鏈接庫文件,全部拷貝到C:/WINDOWS/system目錄下;將1.2中的靜態庫文件,全部拷貝到C:/Program Files/Microsoft Visual Studio/VC98/Lib目錄下。
2 點云數據輸入
該文點云數據由Trimble GX三維激光掃描儀掃描獲得,該掃描儀輸出數據源文件格式是pcf,不能直接使用記事本等工具打開。解決的辦法是先使用該三維激光掃描儀自帶的RealWorks軟件將該pcf格式文件轉換成asc/txt格式輸出。
輸出時除了可以輸出坐標信息XYZ(3個字段),還可以選擇輸出灰度值(1個字段)、RGB顏色(3個字段)和法線信息(3個字段)。
假設,僅輸出XYZ坐標3個字段,輸出格式為asc??梢酝ㄟ^兩種方式讀入坐標點信息:①利用MFC封裝的CStdioFile類ReadString方法先將數據按行讀入,再對每行字符串進行解析,分離出每個點的X、Y、Z坐標。②直接使用C語言提供的fscan函數將每行數據讀入對應的字段。
3 點云數據顯示
首先創建一個基于單文檔的OpenGL應用程序,并在頭文件中添加必要的OpenGL庫文件和消息響應函數,最后在源文件的相應函數中添加代碼實現。殷福忠等[4-6]做了較為詳細的介紹,效果如圖1。
圖1 石頭城點云圖像
讀入點云數據并顯示之后,有時需要對點云圖像作進一步處理,因此需要實現用戶對點云圖像的簡單交互功能,比如點云圖像的旋轉、平移、縮放和渲染等功能。
3.1 點云圖像旋轉
點云的旋轉是為了實現用戶以不同的視角查看點云圖像。在OpenGL中一般通過glRotatef(GLdouble angle,GLdouble x,GLdouble y,GLdouble z)函數實現點云圖像的旋轉,參數angle是旋轉的角度,(x,y,z)構成了一個從OpenGL坐標原點到(x,y,z)點的向量,是圖像旋轉時的旋轉軸,點云圖像旋轉的主要算法如下:
Angle_X + =(point.y - m_LastMousePointDown.y)/ 3.6;
Angle_Y + =(point.x - m_LastMousePointDown.x)/ 3.6;
Angle_X、Angle_Y是點云圖像繞X、Y軸旋轉的角度;Point、m_LastMousePointDown分別為當前鼠標按下時的位置和上次鼠標按下時的位置。效果如圖2。
3.2 點云圖像平移
點云的平移是為了方便了用戶查看點云圖像的不同部分。在OpenGL中一般通過glTranslatef(GLfloat x,GLfloat y,GLfloat z)函數實現點云圖像的平移,其中x、y、z分別表示沿x、y、z軸方向的平移長度。
3.3 點云圖像縮放
點云的縮放是方便了用戶以不同的比例查看點云圖像。glScaled(GLdouble x,GLdouble y,GLdouble z),參數x、y、z分別指的是沿x、y、z軸的縮放因子。若x=y=z,此時圖像在xyz軸實現等比例縮放。為了保證圖像不失真,在實際操作中一般我們令x=y=z,以實現三個坐標軸方向上等比例縮放,效果如圖3。
圖2 點云圖像旋轉
圖3 點云圖像縮放
3.4 點云圖像渲染
點云數據中除坐標信息XYZ外,還包括顏色等其他信息,單純地根據坐標信息有時難以識別地物,因此需要顏色信息輔助用戶判讀圖像中的地物或者通過把圖像渲染成特定的顏色來增加視覺效果以方便處理。glColor3f(GLfloat red,GLfloat green,GLfloat blue)函數提供了設置點云顏色的功能,參數red、green、blue分別代表顏色信息RGB的分量。值得注意的是,由于OpenGL中使用的是齊次坐標,因此如果參數red、green、blue的值大于1,要分別除以255。原始顏色渲染的圖像效果如圖4,自定義顏色渲染的圖像效果如圖5。
圖4 點云圖像原始顏色渲染
圖5 點云圖像自定義顏色渲染
4 結語
基于VC6開放的接口功能與OpenGL高效的圖形處理能力,該文將VC6與OpenGL緊密結合實現了對點云數據的顯示、縮放、平移、旋轉和渲染等可視化及簡單的用戶操作功能。通過對實測點云數據可視化的測試,表明MFC單文檔和 OpenGL在點云可視化與編輯方面有著強大的功能,具有一定的研究價值和應用
價值。
參考文獻
[1]Kolluri R,Shewchuk J R,Obrien J F.Spectral surface reconstruction from noisy point clouds.[C]//Eurographics Symposium on Geometry Processing.2004.
[2]Lee DT,Schachter BJ.Two algorithms for constructing a delaunay triangulation[J].International Journal of Computer and Information Sciences,1980,9(3).
[3]Hoppe H,DeRose T,Duchamp T,et al.Surface reconstruction from unorganized points.Computer Graphics.1992.
[4]殷福忠,曲鑫,曲林,等.基于MFC單文檔和OpenGL的激光掃描數據可視化與編輯的研究[J].測繪與空間地理信息,2009,32(6).
[5]劉慧杰,靳海亮.基于VC++的OpenGL三維圖形開發設計[J].計算機與數字工程,2009(7).
[6]和平鴿工作室編著.OpenGL三維圖形系統開發與實用技術[M].重慶大學出版社,2003.