最具体和最简单的PDAL库配置及在VS2019上测试

前言

libLAS 是一套用于处理常见的 “LAS” LiDAR 格式数据的 C/C++ 函数库。其中ASPRS LAS 格式 是一种 LiDAR 数据点云的序列二进制编码,可用于 LiDAR 传感器数据的存储和相应软件的交换、存档与处理。
  注:LiDAR(Light Detection and Ranging 光信号测距技术)是一种高精度的测距方法。其采用类似无线电雷达的原理,但采用激光信号实现。LiDAR 产生一种称为“点云”的产品,其中各个点代表反射信号源到传感器的距离。ASPRS LAS 是其产品的常见存储格式。
  基本原理如图1最具体和最简单的PDAL库配置及在VS2019上测试_第1张图片
但是截至2018年,libLAS项目已被PDAL项目取代,PDAL是是一个用于翻译和处理点云数据的 C/C++ 开源库和应用程序,用于点云数据的转换和处理。 尽管该库中许多工具的重点和发展都起源于激光雷达点云数据的处理,但它也不限于激光雷达数据。
用于点云数据的转换和处理。 尽管该库中许多工具的重点和发展都起源于激光雷达点云数据的处理,但它也不限于激光雷达数据。

最具体的方法

下载

1、下载OSGeo4W网络安装程序:https://trac.osgeo.org/osgeo4w/
最具体和最简单的PDAL库配置及在VS2019上测试_第2张图片
2、按如下操作
最具体和最简单的PDAL库配置及在VS2019上测试_第3张图片

最具体和最简单的PDAL库配置及在VS2019上测试_第4张图片
最具体和最简单的PDAL库配置及在VS2019上测试_第5张图片
注意这个Root Directory ,后面经常会用到
最具体和最简单的PDAL库配置及在VS2019上测试_第6张图片
最具体和最简单的PDAL库配置及在VS2019上测试_第7张图片
选择https://ftp.osuosl.org(其他的应该也可以,只是没测试)
最具体和最简单的PDAL库配置及在VS2019上测试_第8张图片
搜索框输入pdal
最具体和最简单的PDAL库配置及在VS2019上测试_第9张图片
点击skip,选中图中版本。
在同意各种协议后,耐心等待
最具体和最简单的PDAL库配置及在VS2019上测试_第10张图片
最终结果
最具体和最简单的PDAL库配置及在VS2019上测试_第11张图片

最简单的方法

直接下载我配置好的

链接:https://pan.baidu.com/s/1-vHXQB7_cfk_ZSBVkx_VSg
提取码:hqv0
–来自百度网盘超级会员V2的分享

配置

添加环境变量

右击电脑属性——搜索编辑系统环境变量环境变量系统变量Path
添加Root Directory路径中的bin文件夹
例:
最具体和最简单的PDAL库配置及在VS2019上测试_第12张图片

配置VS2019属性表

打开项目——属性
(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

至此配置完成

测试代码(结合PCL库进行可视化)

#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;
}


效果如图

最具体和最简单的PDAL库配置及在VS2019上测试_第13张图片

你可能感兴趣的:(c++,人工智能,算法)