libLAS
是一套用于处理常见的 “LAS” LiDAR 格式数据的 C/C++ 函数库。其中ASPRS LAS
格式 是一种 LiDAR 数据点云的序列二进制编码,可用于 LiDAR 传感器数据的存储和相应软件的交换、存档与处理。
注:LiDAR(Light Detection and Ranging 光信号测距技术)是一种高精度的测距方法。其采用类似无线电雷达的原理,但采用激光信号实现。LiDAR 产生一种称为“点云”的产品,其中各个点代表反射信号源到传感器的距离。ASPRS LAS 是其产品的常见存储格式。
基本原理如图1
但是截至2018年,libLAS项目已被PDAL
项目取代,PDAL是是一个用于翻译和处理点云数据的 C/C++ 开源库和应用程序,用于点云数据的转换和处理。 尽管该库中许多工具的重点和发展都起源于激光雷达点云数据的处理,但它也不限于激光雷达数据。
用于点云数据的转换和处理。 尽管该库中许多工具的重点和发展都起源于激光雷达点云数据的处理,但它也不限于激光雷达数据。
1、下载OSGeo4W网络安装程序:https://trac.osgeo.org/osgeo4w/
2、按如下操作
注意这个Root Directory
,后面经常会用到
选择https://ftp.osuosl.org
(其他的应该也可以,只是没测试)
搜索框输入pdal
点击skip,选中图中版本。
在同意各种协议后,耐心等待
最终结果
链接:https://pan.baidu.com/s/1-vHXQB7_cfk_ZSBVkx_VSg
提取码:hqv0
–来自百度网盘超级会员V2的分享
右击电脑属性
——搜索编辑系统环境变量
—环境变量
—系统变量
—Path
添加Root Directory
路径中的bin
文件夹
例:
打开项目
——属性
(1) VC++目录
——包含目录
——添加Root Directory
下的include
文件夹
(2) VC++目录
——库目录
——添加Root Directory
下的lib
文件夹
(3) 链接器
——输入
——附加依赖项
添加如下文件
pdalcpp.lib
pdal_util.lib
libpdal_plugin_writer_pgpointcloud.lib
libpdal_plugin_reader_pgpointcloud.lib
libpdal_plugin_kernel_fauxplugin.lib
liblas_c.lib
liblas.lib
laszip3.lib
至此配置完成
#pragma execution_character_set("utf-8")//解决中文
#include
#include
#include
#include
#include
typedef pcl::PointXYZRGB PointT;
//Las2Pointxyzrgb
void ReadLas(pcl::PointCloud<PointT>::Ptr& cloud0, std::string filename) {
pdal::Option las_opt("filename", filename);
pdal::Options las_opts;
las_opts.add(las_opt);
pdal::LasReader las_reader;
pdal::PointTable table;
las_reader.setOptions(las_opts);
las_reader.prepare(table);
pdal::PointViewSet point_view_set = las_reader.execute(table);
pdal::PointViewPtr point_view = *point_view_set.begin();
pdal::LasHeader las_header = las_reader.header();
//头文件信息
unsigned int PointCount = las_header.pointCount();
double scale_x = las_header.scaleX();
double scale_y = las_header.scaleY();
double scale_z = las_header.scaleZ();
double offset_x = las_header.offsetX();
double offset_y = las_header.offsetY();
double offset_z = las_header.offsetZ();
//读点
unsigned int n_features = las_header.pointCount();
int count = 0;
for (pdal::PointId id = 0; id < point_view->size(); ++id)
{
double x = point_view->getFieldAs<double>(pdal::Dimension::Id::X, id);
double y = point_view->getFieldAs<double>(pdal::Dimension::Id::Y, id);
double z = point_view->getFieldAs<double>(pdal::Dimension::Id::Z, id);
double red = point_view->getFieldAs<double>(pdal::Dimension::Id::Red, id);
double green = point_view->getFieldAs<double>(pdal::Dimension::Id::Green, id);
double blue = point_view->getFieldAs<double>(pdal::Dimension::Id::Blue, id);
double point_class = point_view->getFieldAs<double>(pdal::Dimension::Id::Classification, id);
int r2, g2, b2;
r2 = ceil(((float)red / 65536) * (float)256);
g2 = ceil(((float)green / 65536) * (float)256);
b2 = ceil(((float)blue / 65536) * (float)256);
PointT point(x, y, z, r2, g2, b2);
cloud0->push_back(point);
}
}
int main()
{
//
pcl::PointCloud<PointT>::Ptr cloud0(new pcl::PointCloud<PointT>);
ReadLas(cloud0, "C:\\Users\\Administrator\\Desktop\\LAS\\1.las");//换成自己的las文件
//pcl::io::savePCDFile("1.pcd", *cloud0);
//--------------------------------------可视化--------------------------
pcl::visualization::PCLVisualizer viewer;
viewer.addPointCloud(cloud0, "cloud");
viewer.addCoordinateSystem();
while (!viewer.wasStopped())
{
viewer.spinOnce(100);
}
return 0;
}