PCL中点云滤波器的使用(Filtering In PCL)

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 使用方式如下:

  • 11
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值