1 开发环境配置
(1) VS2015 & PCL1.8.1
(2) 配置PCL头文件及库目录
Include:
$(PCL_ROOT);
$(PCL_ROOT)\include\pcl-1.8;
$(PCL_ROOT)\3rdParty\Eigen\eigen3;
$(PCL_ROOT)\3rdParty\FLANN\include;
$(PCL_ROOT)\3rdParty\VTK\include\vtk-8.0;
$(PCL_ROOT)\3rdParty\Boost\include\boost-1_64;
lib:
$(PCL_ROOT)\lib\*.lib
$(PCL_ROOT)\3rdParty\VTK\lib\*.lib
$(PCL_ROOT)\3rdParty\FLANN\lib\*.lib
$(PCL_ROOT)\3rdParty\Boost\lib\*.lib
2 PCL 滤波器介绍
PCL中基本滤波器主要有以下六种:
(1)PassThrough filter
PassThrough filter是在特定的维度(x, y, z坐标轴中的某一个)对点云进行滤波,即移除给定范围的内部点云或外部点云。使用方式如下代码所示,
// Create the filtering object
pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud(cloud);
pass.setFilterFieldName("z");
pass.setFilterLimits(580.0, 900.0);
//pass.setFilterLimitsNegative (true);
pass.filter(*cloud_filtered);
以上代码主要是创建PassThrough filter对象并设置其参数,此处滤波坐标系设置为Z轴,通过setFilterLimits来选取( 580<Z<900 )内的点云。当setFilterLimitsNegative参数设为True时,则选取( Z<580 || Z >900 )内的点云,程序最后一行filter的参数指定滤波后的点云。下图为选取点云的简单示意图:
官方示例给出结果为:
Cloud before filtering:
0.352222 -0.151883 -0.106395
-0.397406 -0.473106 0.292602
-0.731898 0.667105 0.441304
-0.734766 0.854581 -0.0361733
-0.4607 -0.277468 -0.916762
Cloud after filtering:
-0.397406 -0.473106 0.292602
-0.731898 0.667105 0.441304
但是在我电脑上运行时,得到的点云值均比较大,重新设置阈值为0~200后,得到结果如下:
D:\asher\project\FiltersInPCL\bin>FiltersInPCL.exe
Cloud before filtering:
1.28125 577.094 197.938
828.125 599.031 491.375
358.688 917.438 842.563
764.5 178.281 879.531
727.531 525.844 311.281
Cloud after filtering:
1.28125 577.094 197.938
原因是官方例子中的Rand()返回的数值与我的电脑上返回数值不一致,我的返回数值参考http://www.cplusplus.com/reference/cstdlib/rand/可知结果正确的,但是官方例子Rand()返回的为0到1之间小数,调用的为excel函数,可参考https://baike.baidu.com/item/rand%28%29。
对原始代码稍作修改,读入一ply文件测试结果,
原始点云:
没有调用setFilterLimitsNegative(true)时结果:
调用setFilterLimitsNegative(true)后:
可以看到在我的ply文件中有两个平面,当我设置一个合适的阈值时,就可以得到其中的一个平面,这是其中的一种垂直于坐标轴较极端情况。
源码和具体工程请参考https://github.com/yazhouzheng/FilteringInPCL.git 中的 passthrough.cpp 文件。
(2)VoxelGrid filter
VoxelGrid filter 是通过体素化网格方法对点云数据集进行降采样(即减少点云的个数)。体素网格类在输入点云上创建一个三维体素网格。我们可以把每个体素网格想象成空间中一组微小的三维立方体。然后在每个体素中(即每个三维立方体中),所有存在的点都近似其质心(即,向下采样)。这种方法比用体素的中心来近似要慢一些,但它更准确地表示了点云所处的潜在曲面。VoxelGrid filter 使用方式如下: