劉潔
(湖南省公路設計有限公司,湖南 長沙 410011)
基于C++與PCL的LAS數據讀取及顯示
劉潔
(湖南省公路設計有限公司,湖南 長沙 410011)
點云庫PCL(Point Cloud Library)是專門處理點云數據的公開庫,LAS則是機載激光雷達(Aiborne LiDAR)的數據格式,需專業軟件進行讀取。由于PCL無法直接讀取LAS數據,給基于PCL的點云數據處理帶來了不便。為此解析了LAS數據格式,在此基礎上使用C++編程讀取LAS數據并進行了可視化顯示。以某一區域LAS數據進行試驗,結果表明程序運行正常,這為后續基于PCL的點云數據處理提供了數據源。
C++;點云庫;機載激光雷達;可視化;格式
機載激光雷達(Airborne LiDAR,ALiDAR)是一種通過發射器發射激光,激光接收器接收反射回的信號來測量地面數據的技術手段。由于其可快速、大面積、不受環境影響獲取測區數據的優勢,因而在測繪領域得到了廣泛應用[1,2]。機載激光雷達技術采集獲取的數據為LAS格式,需要專業軟件讀取點云數據。點云庫(Point Cloud Library,PCL)是專門用來處理點云數據的開源點云庫,其默認數據格式為PCD,無法直接讀取LAS數據[3,4]。若使用PCL來處理LAS數據,需將LAS數據轉換成PCD格式,才可進行后續數據處理。目前常見的有使用MATLAB語言、C++、C#等編程讀取LAS數據,但極少將其與PCL進行關聯[5~8]。
本文在分析LAS數據格式及PCD格式基礎上,在 Visual Studio 2013搭建好的平臺上使用C++編程讀取LAS數據,最后進行可視化顯示。以某一地區采集的數據進行數據讀取與可視化顯示試驗。試驗結果表明,本程序可以正確讀取LAS數據并進行顯示,這為后續基于PCL的點云數據處理提供了數據源。
完整的LAS數據文件包括三大部分,分別為公共頭文件、變長記錄和點記錄區[6]。LAS標準的數據格式經過若干次修改,目前已發布的版本有1.0、1.1、1.2、1.3、1.4等系,每一版本均包括上述三部分。下面以1.0版本的LAS數據格式進行講解。
1.1 公共頭文件
公共頭文件主要包括LAS數據的基本信息,如采集數據日期、儀器,點數等。表1所示為公共頭文件包含的幾項重要參數,以及每一項對應的類型。

表1 公共頭文件
在編程讀取數據過程中,要特別注意幾項參數。如主版本號與副版本號,其對應了LAS數據的版本號。文件頭長度,其表示公共頭文件所占的字節數,不同版本其所占字節數不一樣。如在1.0版本中,其長度為227。
在C++中可用read()函數按照字節進行讀取[9],如下面代碼所示:
ifstream infname(str,ios::binary|ios::in);
infname.read((char*)&public_header_block.file_ signature,sizeof(public_header_block.file_signature));
該段代碼是創建infname文件流對象,然后按字節數讀取LAS文件,并將讀取內容返回,如本文此次會返回文件標簽“LASF”。
按照上面的讀取方法,即可完成公共頭文件的讀取。
1.2 變長記錄和點記錄區
變長記錄主要包括用戶ID,記錄ID以及擴展域,而點數據記錄域主要記錄點的X、Y、Z坐標值及其他信息。表2為1.0版本的點數據記錄區。

表2 點記錄區域
其中X、Y、Z坐標需要按照公式(1)計算:

式中:Xcoordinate、Ycoordinate、Zcoordinate分別為點的地理坐標;Xrecord、Yrecord、Zrecord分別為點數據記錄區中記錄點坐標;Xscale、Yscale、Zscale分別為頭部文件 X、Y、Z的比例因子;Xoffset、Yoffset、Zoffset分別為X、Y、Z的偏移量。
在點記錄區域,可以根據點的個數,使用循環語句讀取點坐標,如下所示:
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循環語讀取每一點的X、Y、Z坐標,并將坐標值保存到文本中,這樣可以直接用文本查看數據。 點云庫PCL是包含點云數據處理中常見算法的公開庫源,但其默認的數據格式為PCD,因此需要將LAS中讀取的點坐標格式轉換成PCD格式,再進行數據處理。 2.1 PCD數據格式 PCD數據格式包括頭文件和點數據區域兩部分,其頭文件格式相對LAS要簡單。頭文件包括PCD數據版本,每個點的維度、類型及點的個數,獲取點的視點等信息。圖1為PCD 0.7版本數據頭文件格式,其中該數據文件包括656 487個點,每個點均包含X、Y、Z坐標。 圖1 PCD數據頭文件格式 2.2 點云可視化顯示 在PCL中,其可視化工具為VTK(Visualization Toolkit),在將LAS數據轉換成PCD格式文件后,即可以利用VTK顯示點云,實現可視化。其部分代碼如下[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 該段代碼是創建點云對象指針cloud,再利用loadPCD函數將點云進行加載,同時創建可視化窗口viewer,并將可視化窗口背景顏色設置為黑色,點云顏色設置成綠色。 本文選取2016年期間采集的某一測區數據進行試驗,在Visual Studio 2013平臺上采用C++語言進行編寫,同時在工程中配置好PCL開發環境。其中保存在文本中點坐標部分數據如圖2所示,讀取LAS數據文件的部分頭文件信息如圖3所示。 圖2 數據讀取保存 圖3 頭文件部分信息 最后將采集的點數據進行可視化的點云結果如圖4所示,可以通過鼠標滾動、拖動,變換視角來瀏覽該區域數據。 圖4 LAS點云數據可視化 本文主要介紹了LAS數據格式及PCD數據格式,并用C++編程進行讀取、轉換及可視化LAS數據。基于C++的LAS數據讀取,可以快速讀取轉換數據格式,為后面基于PCL的點云數據處理研究,以及基于LAS數據的應用提供可靠的數據來源,具有重要意義。 [1]駱云飛,王書民.機載LiDAR系統在道路勘測中的數據獲取及應用[J].測繪通報,2012(S1):362-364,371. [2]范正岳,徐茂文.基于三維激光掃描的露天礦山儲量測量研究[J].礦山測量,2014(4):10-11. [3]羅方燕.PCL庫點云統計去噪算法的應用研究[J].現代計算機(專業版),2016(26):63-66. [4]南剛雷,張瑞峰,張梓然.基于PCL的柴油機缸蓋三維特征提取技術[J].電子測量技術,2016(2):80-82,98. [5]任常青,張青萍,張曉宇.基于AutoCAD的LIDAR點云數據可視化[J].測繪技術裝備,2011,13(3):42-45. [6]趙自明,史兵,田喜平,等.LAS格式解析及其數據的讀取與顯示[J].測繪技術裝備,2010,12(3):17-20. [7]蘇偉戴,王森,李沁,等.基于OpenGL的LiDAR數據處理模塊設計與實現[J].中國農業大學學報,2012(2):150-158. [8]聞兆海,謝忠.基于Matlab的LAS格式數據解析與顯示[J].地理空間信息,2015(1):50-52. [9]譚浩強.C++程序設計[M].北京:清華大學出版社,2004:439-453. [10]朱德海,郭浩,蘇偉.點云庫PCL學習教程[M].北京:北京航空航天大學出版社,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數據及點云可視化

3 LAS數據讀取及顯示試驗



4 結語