劉潔
(湖南省公路設(shè)計有限公司,湖南 長沙 410011)
基于C++與PCL的LAS數(shù)據(jù)讀取及顯示
劉潔
(湖南省公路設(shè)計有限公司,湖南 長沙 410011)
點云庫PCL(Point Cloud Library)是專門處理點云數(shù)據(jù)的公開庫,LAS則是機載激光雷達(Aiborne LiDAR)的數(shù)據(jù)格式,需專業(yè)軟件進行讀取。由于PCL無法直接讀取LAS數(shù)據(jù),給基于PCL的點云數(shù)據(jù)處理帶來了不便。為此解析了LAS數(shù)據(jù)格式,在此基礎(chǔ)上使用C++編程讀取LAS數(shù)據(jù)并進行了可視化顯示。以某一區(qū)域LAS數(shù)據(jù)進行試驗,結(jié)果表明程序運行正常,這為后續(xù)基于PCL的點云數(shù)據(jù)處理提供了數(shù)據(jù)源。
C++;點云庫;機載激光雷達;可視化;格式
機載激光雷達(Airborne LiDAR,ALiDAR)是一種通過發(fā)射器發(fā)射激光,激光接收器接收反射回的信號來測量地面數(shù)據(jù)的技術(shù)手段。由于其可快速、大面積、不受環(huán)境影響獲取測區(qū)數(shù)據(jù)的優(yōu)勢,因而在測繪領(lǐng)域得到了廣泛應(yīng)用[1,2]。機載激光雷達技術(shù)采集獲取的數(shù)據(jù)為LAS格式,需要專業(yè)軟件讀取點云數(shù)據(jù)。點云庫(Point Cloud Library,PCL)是專門用來處理點云數(shù)據(jù)的開源點云庫,其默認數(shù)據(jù)格式為PCD,無法直接讀取LAS數(shù)據(jù)[3,4]。若使用PCL來處理LAS數(shù)據(jù),需將LAS數(shù)據(jù)轉(zhuǎn)換成PCD格式,才可進行后續(xù)數(shù)據(jù)處理。目前常見的有使用MATLAB語言、C++、C#等編程讀取LAS數(shù)據(jù),但極少將其與PCL進行關(guān)聯(lián)[5~8]。
本文在分析LAS數(shù)據(jù)格式及PCD格式基礎(chǔ)上,在 Visual Studio 2013搭建好的平臺上使用C++編程讀取LAS數(shù)據(jù),最后進行可視化顯示。以某一地區(qū)采集的數(shù)據(jù)進行數(shù)據(jù)讀取與可視化顯示試驗。試驗結(jié)果表明,本程序可以正確讀取LAS數(shù)據(jù)并進行顯示,這為后續(xù)基于PCL的點云數(shù)據(jù)處理提供了數(shù)據(jù)源。
完整的LAS數(shù)據(jù)文件包括三大部分,分別為公共頭文件、變長記錄和點記錄區(qū)[6]。LAS標(biāo)準(zhǔn)的數(shù)據(jù)格式經(jīng)過若干次修改,目前已發(fā)布的版本有1.0、1.1、1.2、1.3、1.4等系,每一版本均包括上述三部分。下面以1.0版本的LAS數(shù)據(jù)格式進行講解。
1.1 公共頭文件
公共頭文件主要包括LAS數(shù)據(jù)的基本信息,如采集數(shù)據(jù)日期、儀器,點數(shù)等。表1所示為公共頭文件包含的幾項重要參數(shù),以及每一項對應(yīng)的類型。
表1 公共頭文件
在編程讀取數(shù)據(jù)過程中,要特別注意幾項參數(shù)。如主版本號與副版本號,其對應(yīng)了LAS數(shù)據(jù)的版本號。文件頭長度,其表示公共頭文件所占的字節(jié)數(shù),不同版本其所占字節(jié)數(shù)不一樣。如在1.0版本中,其長度為227。
在C++中可用read()函數(shù)按照字節(jié)進行讀取[9],如下面代碼所示:
ifstream infname(str,ios::binary|ios::in);
infname.read((char*)&public_header_block.file_ signature,sizeof(public_header_block.file_signature));
該段代碼是創(chuàng)建infname文件流對象,然后按字節(jié)數(shù)讀取LAS文件,并將讀取內(nèi)容返回,如本文此次會返回文件標(biāo)簽“LASF”。
按照上面的讀取方法,即可完成公共頭文件的讀取。
1.2 變長記錄和點記錄區(qū)
變長記錄主要包括用戶ID,記錄ID以及擴展域,而點數(shù)據(jù)記錄域主要記錄點的X、Y、Z坐標(biāo)值及其他信息。表2為1.0版本的點數(shù)據(jù)記錄區(qū)。
表2 點記錄區(qū)域
其中X、Y、Z坐標(biāo)需要按照公式(1)計算:
式中:Xcoordinate、Ycoordinate、Zcoordinate分別為點的地理坐標(biāo);Xrecord、Yrecord、Zrecord分別為點數(shù)據(jù)記錄區(qū)中記錄點坐標(biāo);Xscale、Yscale、Zscale分別為頭部文件 X、Y、Z的比例因子;Xoffset、Yoffset、Zoffset分別為X、Y、Z的偏移量。
在點記錄區(qū)域,可以根據(jù)點的個數(shù),使用循環(huán)語句讀取點坐標(biāo),如下所示:
for(int i=0;i { infname.read((char*)&las3.x,sizeof(las3.x)); infname.read((char*)&las3.y,sizeof(las3.y)); infname.read((char*)&las3.z,sizeof(las3.z)); infname.read((char*)&tem,sizeof(tem)); outfname< } 該段斷碼使用for循環(huán)語讀取每一點的X、Y、Z坐標(biāo),并將坐標(biāo)值保存到文本中,這樣可以直接用文本查看數(shù)據(jù)。 點云庫PCL是包含點云數(shù)據(jù)處理中常見算法的公開庫源,但其默認的數(shù)據(jù)格式為PCD,因此需要將LAS中讀取的點坐標(biāo)格式轉(zhuǎn)換成PCD格式,再進行數(shù)據(jù)處理。 2.1 PCD數(shù)據(jù)格式 PCD數(shù)據(jù)格式包括頭文件和點數(shù)據(jù)區(qū)域兩部分,其頭文件格式相對LAS要簡單。頭文件包括PCD數(shù)據(jù)版本,每個點的維度、類型及點的個數(shù),獲取點的視點等信息。圖1為PCD 0.7版本數(shù)據(jù)頭文件格式,其中該數(shù)據(jù)文件包括656 487個點,每個點均包含X、Y、Z坐標(biāo)。 圖1 PCD數(shù)據(jù)頭文件格式 2.2 點云可視化顯示 在PCL中,其可視化工具為VTK(Visualization Toolkit),在將LAS數(shù)據(jù)轉(zhuǎn)換成PCD格式文件后,即可以利用VTK顯示點云,實現(xiàn)可視化。其部分代碼如下[10]: pcl::PointCloud pcl::io::loadPCDFile(str,*cloud); pcl::visualization::PCLVisualizer viewer("visualization"); viewer.setBackgroundColor(0,0,0); pcl::visualization:PointCloudColorHandlerCustom< pcl::PointXYZ>single_color(cloud,0,255,0); viewer.addPointCloud 該段代碼是創(chuàng)建點云對象指針cloud,再利用loadPCD函數(shù)將點云進行加載,同時創(chuàng)建可視化窗口viewer,并將可視化窗口背景顏色設(shè)置為黑色,點云顏色設(shè)置成綠色。 本文選取2016年期間采集的某一測區(qū)數(shù)據(jù)進行試驗,在Visual Studio 2013平臺上采用C++語言進行編寫,同時在工程中配置好PCL開發(fā)環(huán)境。其中保存在文本中點坐標(biāo)部分數(shù)據(jù)如圖2所示,讀取LAS數(shù)據(jù)文件的部分頭文件信息如圖3所示。 圖2 數(shù)據(jù)讀取保存 圖3 頭文件部分信息 最后將采集的點數(shù)據(jù)進行可視化的點云結(jié)果如圖4所示,可以通過鼠標(biāo)滾動、拖動,變換視角來瀏覽該區(qū)域數(shù)據(jù)。 圖4 LAS點云數(shù)據(jù)可視化 本文主要介紹了LAS數(shù)據(jù)格式及PCD數(shù)據(jù)格式,并用C++編程進行讀取、轉(zhuǎn)換及可視化LAS數(shù)據(jù)。基于C++的LAS數(shù)據(jù)讀取,可以快速讀取轉(zhuǎn)換數(shù)據(jù)格式,為后面基于PCL的點云數(shù)據(jù)處理研究,以及基于LAS數(shù)據(jù)的應(yīng)用提供可靠的數(shù)據(jù)來源,具有重要意義。 [1]駱云飛,王書民.機載LiDAR系統(tǒng)在道路勘測中的數(shù)據(jù)獲取及應(yīng)用[J].測繪通報,2012(S1):362-364,371. [2]范正岳,徐茂文.基于三維激光掃描的露天礦山儲量測量研究[J].礦山測量,2014(4):10-11. [3]羅方燕.PCL庫點云統(tǒng)計去噪算法的應(yīng)用研究[J].現(xiàn)代計算機(專業(yè)版),2016(26):63-66. [4]南剛雷,張瑞峰,張梓然.基于PCL的柴油機缸蓋三維特征提取技術(shù)[J].電子測量技術(shù),2016(2):80-82,98. [5]任常青,張青萍,張曉宇.基于AutoCAD的LIDAR點云數(shù)據(jù)可視化[J].測繪技術(shù)裝備,2011,13(3):42-45. [6]趙自明,史兵,田喜平,等.LAS格式解析及其數(shù)據(jù)的讀取與顯示[J].測繪技術(shù)裝備,2010,12(3):17-20. [7]蘇偉戴,王森,李沁,等.基于OpenGL的LiDAR數(shù)據(jù)處理模塊設(shè)計與實現(xiàn)[J].中國農(nóng)業(yè)大學(xué)學(xué)報,2012(2):150-158. [8]聞?wù)缀#x忠.基于Matlab的LAS格式數(shù)據(jù)解析與顯示[J].地理空間信息,2015(1):50-52. [9]譚浩強.C++程序設(shè)計[M].北京:清華大學(xué)出版社,2004:439-453. [10]朱德海,郭浩,蘇偉.點云庫PCL學(xué)習(xí)教程[M].北京:北京航空航天大學(xué)出版社,2012:133-158. TP751 A 1009-7716(2017)08-0272-03 10.16799/j.cnki.csdqyfh.2017.08.086 2017-04-01 劉潔(1969-),男,湖南長沙人,工程師,從事工程測量工作。2 PCD數(shù)據(jù)及點云可視化
3 LAS數(shù)據(jù)讀取及顯示試驗
4 結(jié)語