利用PDAL2.7.1 实现点云滤波

 利用PDAL2.7.1 实现点云滤波

      本文介绍利用PDAL实现点云滤波方法,包含pipeline命令行运行、C++代码两种方法,C++代码分别介绍对点云文件进行滤波、点云全部在内存中进行滤波的pdal两种调用方法。并简单探究pdal的设计结构。


目录

  • 1 pipeline命令调用方法
  • 2 文件滤波,C++调用方法
  • 3 全内存,C++调用方法
  • 4 pdal设计结构简单探究

  • 1 pipeline命令调用方法

       参照pdal官网介绍,以csf滤波为例:filters.csf — pdal.io

       直接调用pdal.exe pipeline filter.json 即可运行,实现点云滤波,其中filter.json中的内容如上图所示,其中"input.las"、"output.laz"分别为输入和输出点云文件,可更具本地具体路径进行相应的修改。滤波结果如下图所示:

  • 2 文件滤波,C++调用方法
// 添加读取点云文件的Stage
	pdal::StageFactory factory;
	pdal::Stage* reader = factory.createStage("readers.las");
	pdal::Options options_reader; 
	options_reader.add("filename", "test.las");
	reader->addOptions(options_reader);
	// 添加统计异常值滤波器的Stage
	pdal::Stage* csFilter = factory.createStage("filters.csf");
	csFilter->setInput(*reader);
	// 添加写入滤波后的点云文件的Stage
	pdal::Stage* writer = factory.createStage("writers.las");
	pdal::Options options_writer;
	options_writer.add("filename", "test2.las");
	writer->setOptions(options_writer);
	writer->setInput(*csFilter);
	pdal::PointTable table;

	// 添加维度(Dimensions)到PointTableRef
	table.layout()->registerDim(pdal::Dimension::Id::X);
	table.layout()->registerDim(pdal::Dimension::Id::Y);
	table.layout()->registerDim(pdal::Dimension::Id::Z);

	writer->prepare(table);
	writer->execute(table);

	factory.destroyStage(reader);
	factory.destroyStage(csFilter);
	factory.destroyStage(writer);

        具体代码如上,通过pdal::StageFactory创建对应的Stage,其中las文件的读取、滤波、写入都为一个Stage。如上代码分别创建"readers.las"、"filters.csf"、"writers.las"创建Stage对象,其实质为pdal::LasReader、pdal::CSFilter、pdal::LasWriter对象,然后将三个对象串接(前一个对象设置为后一个对象的Input),最后执行(execute)最后一个对象。

  • 3 全内存,C++调用方法
	pdal::StageFactory factory;
	pdal::PointTable table;
	table.layout()->registerDim(pdal::Dimension::Id::X);
	table.layout()->registerDim(pdal::Dimension::Id::Y);
	table.layout()->registerDim(pdal::Dimension::Id::Z);
	pdal::PointViewPtr view(new pdal::PointView(table));
	view->setField(pdal::Dimension::Id::X, 0, 1.0);
	view->setField(pdal::Dimension::Id::Y, 0, 2.0);
	view->setField(pdal::Dimension::Id::Z, 0, 3.0);
	view->setField(pdal::Dimension::Id::X, 1, 4.0);
	view->setField(pdal::Dimension::Id::Y, 1, 5.0);
	view->setField(pdal::Dimension::Id::Z, 1, 6.0);
	view->setField(pdal::Dimension::Id::X, 2, 7.0);
	view->setField(pdal::Dimension::Id::Y, 2, 8.0);
	view->setField(pdal::Dimension::Id::Z, 2, 9.0);
	pdal::Stage* csFilter = (factory.createStage("filters.csf"));
	csFilter->prepare(table);
	pdal::StageWrapper fw;
	fw.initialize(*csFilter, table);
	fw.ready(*csFilter, table);
	fw.run(*csFilter, view);
	fw.done(*csFilter, table);
	pdal::Stage* writer = factory.createStage("writers.las");
	pdal::Options options_writer;
	options_writer.add("filename", "4-1_out.las");
	writer->setOptions(options_writer);
	writer->prepare(table);
	pdal::StageWrapper ww;
	ww.initialize(*writer, table);
	ww.ready(*writer, table);
	ww.run(*writer, view);
	ww.done(*writer, table);
	factory.destroyStage(csFilter);
	factory.destroyStage(writer);

        采用pdal::StageWrapper执行相应的Stage。采用pdal::PointView类设置点的坐标,点全部在内存中。

  • 4 pdal设计结构简单探究

        todo:调试pipeline执行过程,了解类之间关系。

  文章中完整的代码下载地址如下(缺下载积分不得已而为之):https://download.csdn.net/download/CPWWHSU/89254289

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CHPCWWHSU

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

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

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

打赏作者

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

抵扣说明:

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

余额充值