基于C++与PCL的LAS数据读取及显示

2017-09-15 02:57刘洁
城市道桥与防洪 2017年8期
关键词:数据格式数据处理可视化

刘洁

(湖南省公路设计有限公司,湖南 长沙 410011)

基于C++与PCL的LAS数据读取及显示

刘洁

(湖南省公路设计有限公司,湖南 长沙 410011)

点云库PCL(Point Cloud Library)是专门处理点云数据的公开库,LAS则是机载激光雷达(Aiborne LiDAR)的数据格式,需专业软件进行读取。由于PCL无法直接读取LAS数据,给基于PCL的点云数据处理带来了不便。为此解析了LAS数据格式,在此基础上使用C++编程读取LAS数据并进行了可视化显示。以某一区域LAS数据进行试验,结果表明程序运行正常,这为后续基于PCL的点云数据处理提供了数据源。

C++;点云库;机载激光雷达;可视化;格式

0 引言

机载激光雷达(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的点云数据处理提供了数据源。

1 LAS数据格式

完整的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坐标,并将坐标值保存到文本中,这样可以直接用文本查看数据。

2 PCD数据及点云可视化

点云库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,并将可视化窗口背景颜色设置为黑色,点云颜色设置成绿色。

3 LAS数据读取及显示试验

本文选取2016年期间采集的某一测区数据进行试验,在Visual Studio 2013平台上采用C++语言进行编写,同时在工程中配置好PCL开发环境。其中保存在文本中点坐标部分数据如图2所示,读取LAS数据文件的部分头文件信息如图3所示。

图2 数据读取保存

图3 头文件部分信息

最后将采集的点数据进行可视化的点云结果如图4所示,可以通过鼠标滚动、拖动,变换视角来浏览该区域数据。

图4 LAS点云数据可视化

4 结语

本文主要介绍了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-),男,湖南长沙人,工程师,从事工程测量工作。

猜你喜欢
数据格式数据处理可视化
基于CiteSpace的足三里穴研究可视化分析
认知诊断缺失数据处理方法的比较:零替换、多重插补与极大似然估计法*
思维可视化
ILWT-EEMD数据处理的ELM滚动轴承故障诊断
基于CGAL和OpenGL的海底地形三维可视化
“融评”:党媒评论的可视化创新
基于RFID的户外广告监管系统的设计与实现
基于希尔伯特- 黄变换的去噪法在外测数据处理中的应用
Matlab在密立根油滴实验数据处理中的应用
基于特征库的测井数据格式自动识别与转换方法