D435i直接输出的深度点云噪点太多经过滤波处理后再使用
直通滤波 保留或删除某一轴线特定范围内的点,改变视野范围。
pcl::PassThrough<pcl::PointXYZ> range; //创建直通滤波器
range.setInputCloud (cloud); //设置点云输入
range.setFilterFieldName ("z"); //设置滤波的方向,z轴
range.setFilterLimits (0.0, 1.0); //设置滤波的范围
//range.setFilterLimitsNegative (true); //设置范围内点云保留还是过滤,默认保留
range.filter (*cloud_filtered); //执行滤波
体素滤波 使用体素网格进行下采样,减少点云的数量和数据、保留点云表面的形状体征,提高配准、表面重建,不破坏点云本身的几何结构,但是会移动点的位置,可以去除一定程度的噪音点和离群点
原理是根据输入的点云,首先计算一个能够刚好包裹住该点云的立方体,然后根据设定的分辨率,将该大立方体分割成不同的小立方体。对于每一个小立方体内的点,计算他们的质心,并用该质心的坐标来近似该立方体内的若干点。
pcl::VoxelGrid<pcl::PCLPointCloud2> voxel; //创建体素滤波器
voxel.setInputCloud (cloud); //设置点云输入
voxel.setLeafSize (0.01f, 0.01f, 0.01f); //设置滤波的体素大小,0.01m立方体
voxel.filter (*cloud_filtered); //执行滤波
半径滤波 降噪,删除该图像内符合约束条件的点,处理离群点。
原理是设定每个点一定半径范围内至少有足够的邻近点,不满足就会被删除
pcl::RadiusOutlierRemoval<pcl::PointXYZ> radius; //创建半径滤波
radius.setInputCloud(cloud); //设置点云输入
radius.setRadiusSearch(0.8); //设置查询半径,0.8m,并查询该邻域
radius.setMinNeighborsInRadius (2); //该邻域内点的个数小于2则删除
radius.filter (*cloud_filtered); //执行滤波
ros下使用PCL
官方教程:http://wiki.ros.org/pcl/Tutorials#pcl.2BAC8-Tutorials.2BAC8-hydro.Create_a_ROS_package