Win10系统下VisualStudio2019配置PDAL库

一、下载安装

参考:
[1] PDAL:OSGeo4W安装配置测试PDAL
[2] 点云库PCL入门0:vs2019 配置pcl1.12.0

二、配置VS2019

右击项目——属性——配置属性

  1. C/C++——常规——附加包含目录:添加
C:\OSGeo4W64\include
  1. C/C++——预处理器——预处理器定义:添加
_CRT_SECURE_NO_DEPRECATE
_SCL_SECURE_NO_DEPRECATE
  1. 链接器——常规——附加库目录:添加
C:\OSGeo4W64\lib
  1. 链接器——输入——附加依懒项:添加
pdalcpp.lib
pdal_util.lib
  1. 如果与PCL一起使用,且用的是本博客的配库方法,则需要在环境中添加
C:\OSGeo4W64\bin

三、测试代码

   以下代码实现用PDAL读取las点云,使用PCL获取点云的xyz坐标并进行简单的可视化。就目前试用效果来看,PDAL对于中文路径的支持不太友好,但是与Qt结合使用则很完美;PDAL能够实现与PCL的完美结合;与Open3D一起使用会发生冲突(也可能是Open3D的编译问题)。

//#pragma execution_character_set("utf-8")//解决中文路径问题,但同时也会引入新问题
#include <iostream>
#include <memory>
#include <pdal/PointTable.hpp>
#include <pdal/PointView.hpp>
#include <pdal/io/LasReader.hpp>
#include <pdal/io/LasHeader.hpp>
#include <pdal/Options.hpp>
// PCL
#include <pcl/io/pcd_io.h>  
#include <pcl/point_types.h>  
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>

using namespace std;

int main()
{
	string fileName = "test.las";//中文路径可能报错
	pdal::Option las_opt("filename", fileName);//参数1:"filename"(键)
	pdal::Options las_opts;
	las_opts.add(las_opt);

	pdal::PointTable table;
	pdal::LasReader las_reader;

	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::Dimension::IdList dims = point_view->dims();

	pdal::LasHeader las_header = las_reader.header();


	double xmin = las_header.minX();
	double xmax = las_header.maxX();
	double deltaX = xmax - xmin;
	cout << "deltaX=" << fixed << setprecision(4) << deltaX << endl;

	double ymin = las_header.minY();
	double ymax = las_header.maxY();
	double deltaY = ymax - ymin;
	cout << "deltaY=" << fixed << setprecision(4) << deltaY << endl;

	double zmin = las_header.minZ();
	double zmax = las_header.maxZ();
	double deltaZ = zmax - zmin;
	cout << "deltaZ=" << fixed << setprecision(4) << deltaZ << endl;

	unsigned int n_features = las_header.pointCount();
	cout << "PointCount=" << n_features << endl;


	// 头文件信息
	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();

	// 读取点的信息
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	cloud->points.resize(point_view->size());
	for (pdal::PointId id = 0; id < point_view->size(); ++id)
	{
		double x = point_view->getFieldAs<double>(pdal::Dimension::Id::X, id);       // X
		double y = point_view->getFieldAs<double>(pdal::Dimension::Id::Y, id);       // Y
		double z = point_view->getFieldAs<double>(pdal::Dimension::Id::Z, id);       // Z
		double red = point_view->getFieldAs<double>(pdal::Dimension::Id::Red, id);   // R
		double green = point_view->getFieldAs<double>(pdal::Dimension::Id::Green, id);// G
		double blue = point_view->getFieldAs<double>(pdal::Dimension::Id::Blue, id);  // B
		double point_class = point_view->getFieldAs<double>(pdal::Dimension::Id::Classification, id);// 分类标签
		double GPSTime = point_view->getFieldAs<double>(pdal::Dimension::Id::GpsTime, id); // GPS时间
		auto Intensity= point_view->getFieldAs<double>(pdal::Dimension::Id::Intensity, id);// 强度
		// 获取xyz坐标保存进PCL点云容器
		cloud->points[id].x = x;
		cloud->points[id].y = y;
		cloud->points[id].z = z;

	}
	// -----------------------------------使用PCL进行简单可视化---------------------------------------------
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
	viewer->setBackgroundColor(0, 0, 0);
	viewer->setWindowName("PDAL读点云PCL可视化");
	
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);

	viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
	
	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}
	return 0;
}

参考:
[1] pdal读取.las文件(将las数据读取成XYZRGB格式)//las转txt
[2] PDAL库读写多种格式的点云

四、测试结果

在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值