1. 需要进行滤波的4种情况
1 点云数据密度不规则
2 离群点(比如由于遮挡等原因噪声的)
3 下采样
4 噪声
2. PCL滤波中的类(32)和函数(5)
类class pcl::ApproximateVoxelGrid<PointT>
该类根据给定的点云生成三维体素栅格,并利用栅格的中心店近似替代该栅格中的所有点,以此完成降采样,得到滤波效果.
用途:海量数据压缩,滤波,尤其是在特征提取中,选择合适的体素大小可以极大提高效率.
类成员函数:设置栅格大小,设置是否对所有字段(XYZRGBA等)进行下采样等.
1.双边滤波 class pcl::BilateralFilter<PointT>
图像处理中的双边滤波可以较好的保留边界信息
(注:高斯滤波按照距离中心店的远近设置权种,越近则权重越大;
而双边滤波是按照卷积核中元素强度值与中心点强度的近似情况来设置权重,强度值越相近,则该点权重越大 ---顾双边滤波能更好的保留边界信息)
同样,在pcl三维点云滤波中,也是按照强度值来进行滤波的--故要求点云信息中必须包含强度数据
关键成员函数列举:void applyFilter(&output) 对数据点云进行滤波,并输出到output中存储结果
double computePointWeight(pid,vector<points_index>,vector<points_dist>)
2.类BoxClipper3D<pointT>
3.Clipper3D
4. class pcl::ConditionalRemoval<PointT>
用户自定义规则,以规律符合条件的点,非常灵活
关键成员函数:void setKeepOrganized(bool) 是否保留滤波后被删除的点(比如可以直接删除(false),或设置用户自定义值(true) setUserFilterValue(float)
setCondition(ConditionBasePtr condition) 设置滤波条件(具体使用待查)
5. 类卷积滤波 class pcl::filters::Convolution<PointT,PointOut>
实现卷积滤波的功能
关键成员函数void setKernal(const Eigen::ArrayXf & kernal) 设置卷积核(Eigen::Array格式)
void setBordersPolicy(int policy) 设置边缘处理方式 (-1:0处理;0:镜像处理;1:扩展处理,赋值附近的点值)
void setDistanceThreshold(float) 设置卷积时行列相邻点之间的最大距离阈值
void setNumberOfThreads(int) 设置线程数(值-1表示不限制)
void convolveRows(&out) 行卷积实现
void convolveCols(&out) 列卷积实现
void convolve(&out) 先行再列卷积
7. 高斯滤波class pcl::filters::GaussianKernal<PointT,PointTout>
相当于一个具有平滑性能的低通滤波器
关键函数void setSigma(float) 设置高斯标准差(决定了函数的宽度)
setThresholdRelativeToSigma(float)
setThreshold(float)
8. 基于颜色的高斯滤波pcl::filters::GaussianKernalRGB<in,out>
同时考虑XYZ和RGB
9. pcl::CropBox<PointT>
删除用户给定空间内的点
10. pcl::CropHull<PointT>
14 pcl::Filter<PointT>
24. 简单删除离群点class pcl::RadiusOutlierRemoval<PointT>
即如果一个点在radius半径内少于k个点,那么就认为该点是离群点
setRadiusSearch(double radius)
setMinNeighborsInRadius(int k)
26. 均匀概率随机抽样 pcl::RandomSample<PointT>
应用实例
使用直通滤波器对点云进行滤波
对指定某一维度进行滤波,即去掉用户指定范围内的点 --大范围截取ROI
pcl::PassThroudh<pcl::PointXYZ> pass; //设置滤波器对象
pass.setInputCloud(cloud);
pass.setFilterFieldName("z"); //设置对那个维度进行过滤
pass.setFilterLimits(0.0,1.0); // 设置过滤值范围
// pass.setFilterLimitsNegative(true); //设置保留范围内的害死过滤掉范围内的
pass.filter(*out_cloud); // 执行