利用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