点云滤波处理

点云噪声来源:光的衍射,设备精度,操作者经验,环境因素等等带来的影响。离群点:脱离点云主体很远的离散的点,需要剔除。通常点云处理过程中的第一个步骤也就是滤波,才能更好的进行配准,特征提取,曲面重建,可视化等处理过程。

PCL中几种需要滤波的情况:

                                                点云密度不规则,需要平滑处理;

                                                因为遮挡,离散点需要处理;

                                                噪声数据;

                                                大量数据需要下采样;

filter模块中的相关类

1,class pcl::ApproximateVoxelGrid<PointT>:根据给定点云构成三维体素栅格,以每个体素的中心近似体素中包含的点集,进行下采样。主要用于数据压缩。

 关键成员函数:

void setLeafSize(const Eigen::Vector3f &leaf_size):设置叶子体素在三个方向的大小;

void setDownsampleAllData(bool downsample):设置是否对全部字段进行下采样,true表示是,false表示否。

2,class pcl::BilateralFilter<PointT>:双边滤波实现类,双边滤波是基于点的强度信息进行的,而不是基于点的XYZ坐标进行的,所以对点云进行双边滤波,点云必须是包含强度信息的点云才可以

        双边滤波算法:通过取邻近点进行加权平均来修改当前点的位置达到滤波的效果,同时也会剔除与当前点差异较大的相邻采样点,从而达到保证原特征的目的。

关键成员函数:

void applyFilter(PointCloud & output):对输入数据进行滤波并存储到output。

double computePointWeight(const int pid, const std::vector<int> &indices,const std::vector<float> &distances): 计算单点的平均强度,参数:计算点的索引,最近邻点索引集合,到最近邻点距离集合。

void setHalfSize(double sigma_s):设置双边滤波高斯窗的半宽;

void setStdSev(double sigma_r):设置标准参数;

3,class pcl::Clipper3D<PointT>:3维空间裁剪基类的对象,其中类BoxClipper3D<PointT>,PlaneClipper<PointT>均是继承于该基类。

关键成员函数:

virtual bool clipPoint3D(const PointT &point) const=0:裁剪掉单个点point,成功裁剪返回true,否则返回false。

virtual bool clipLineSegment3D(PointT &pt1,PointT &pt2) const=0: 裁剪掉一个线段。

virtual void clipPlanarPolygon3D(std::vector<PointT> &ploygon) const=0: 给定一个有序的点向量,裁剪该有序点定义的多边形。

virtual void clipPlanarPolygon3D(std::vector<PointT> &ploygon,std::vector<PointT>&clipped_polygon) const=0: 给定一个有序的点向量,裁剪该有序点定义的多边形,第二个参数是裁剪后多边形。

virtual void clipPointCloud3D(const pcl::PointCloud<PointT>&cloud_in,std::vector<PointT>clipped,const std::vector<int>&indices=std::vector<int>()) const=0: 输入点云cloud_in,被裁剪点云的索引indices,clipped是裁剪后剩余点云。

 4,class pcl::BoxClipper3D<PointT>:构造一个立方体滤波对象,对该立方体指定一种仿射变换,输出仿射变换后落在该立方体内的点集。默认立方体xyz三个方向的尺寸大小是2,默认中心是坐标原点。

          关键成员函数:

          BoxClipper3D(const Eigen::Affine3f&transformation); transformation:仿射变换矩阵。

          BoxClipper3D(cosnt Eigen::Vector3f &rodrigues,const Eigen::Vector3f &translation,cosnt Eigen::Vector3f &box_size);

          void setTransformation(const Eigen::Affine3f &transformation):设置仿射变换矩阵;

          void setTransformation(cosnt Eigen::Vector3f &rodrigues,const Eigen::Vector3f &translation,cosnt Eigen::Vector3f &box_size)

5,class pcl::ConditionalRemoval<PointT>:实现过滤满足一定条件的点云数据,由用户设置滤波条件。

关键成员函数:

        void setKeepOrganized(bool val):val==true,保留滤掉的点,否则不保留,此时就改变了点云的组织结构。与setUserFilterValue函数连用。

        void setUserFilterValue(float value):如果保留滤波掉的点,通过value设置为保留滤波掉的点填充新值。与setKeepOrganized(bool val)连用。

        void setCondition(ConditionBasePtr condition):设置滤波条件,每个点都必须满足该条件,否则会被滤除。

6,class pcl::filters::Convolution<PointIn,PointOut>:实现卷积滤波功能类。该类在命名空间pcl下的命名空间:filters中被定义。

关键成员函数:

void setKernel(const Eigen::ArrayXf &kernel):设置卷积核;

void setBorderPolicy(int policy):设置边缘处理方式;policy=-1,边缘按照0处理,policy=0,边缘镜像处理,policy=1,直接赋值邻近点的值。

void setDistanceThreshold(const float &threshold):设置行,列方向邻近点允许的距离的最大值。该值与获取点云的设备有关系,kinect设备设置为0.001较合适。

void convolveRows(PointCloudOut &output):根据给定的卷积核按行方向卷积处理,输出卷积后点云output,如果输出的列数少于输入点云的列数则调用策略补齐。

void convolveCols(PointCloudOut &output):根据给定的卷积核按列方向卷积处理,输出卷积后点云output,如果输出的行数少于输入点云的列数则调用策略补齐。

void convolve(const Eigen::ArrayXf &h_kernel,const Eigen::ArrayXf &v_kernel,PointCloudOut &output):根据给定的行方向和列方向卷积核分别对输入点云沿着各自方向进行卷积处理,最后输出处理后的点云,如果沿着两个方向的卷积核相同,可也调用其重载函数:void convolve(PointCloudOut &output).

7,class pcl::filters::ConvolvingKernel<PointInT,PointOutT>:所有卷积核的基类。

关键成员函数:

void setInputCloud(const PointCloudInConstPtr &input):设置输入点云。

virtual PointOutToperator()(const std::vector<int>& indices,const std::vector<float>& distances)=0:根据点的邻域信息对查询点进行卷积处理。卷积的点邻域集在源点云的索引向量indices,到查询点的欧式距离向量distances。

virtual bool initCompute():进行任何计算前,必须调用此方法。

其子类:class::filters::GaussianKernel<>,pcl::filters::GaussianKernelRGB<>:分别是基于高斯核的卷积滤波实现和基于考虑可见光rgb颜色的高斯核卷积滤波实现;

关键成员函数:

void setSigma(float sigma):设置高斯函数标准方差;

void setThresholdRelativeToSigma(float sigme_coeffieient):设置相对于sigma参数的距离阈值,如果距离>sigma_coefficient^2*sigma^2的点在计算时不考虑。

void setThreshold(float threshold):设置距离阈值,如果点之间的距离大于阈值不予以考虑。

8,class pcl::CropBox<PointT>:滤除用户给定立方体内的点云数据。crop:剪切。

关键成员函数:

以下几个函数分别是:设置最小,最大立方体,设置立方体平移量,旋转量,对立方体进行仿射变换

void setMin(const Eigen::Vector4f &min_pt);

void setMax(const Eigen::Vector4f &max_pt)

void setTranslation(const Eigen::Vector3f &transforlation)

void setRotation(const Eigen::Vector3f &rotation);

void setTransform(const Eigen::Affine3f &transform);

void setNegative(boo negative):设置是否采用滤波算子本身的取舍机制,默认false:去除滤波算子本身设计删除的点,true:保留需要滤除的点集。

void setKeepOrganized(bool keep_organized):设置是否保存原点云的组织结构。true:保留,将滤除掉的点值设为NaN,或者设为由setUserFilterValue指定的值。false:在输出点云中将该点彻底删除。

void setUserFilterValue(float value):设定滤掉点云点的填充值。

9,class pcl::CropHull<PointT>:对于CropBox类中的多边形由该类CropHull产生,凸多边形类ConvexHull,凹多边形类ConcaveHull。基类:class pcl::FilterIndices<PointT>

void setHullIndices(const std::vector<Vertices>&polygons):通过的输入多边形产生用于对点进行滤波的多边形外壳的顶点,polygons:多边形外壳的有序顶点向量。

关键成员函数:

void setHullCloud(PointCloudPtr points):设置多边形外壳索引对应的点云points;

void setDim(int dim):设置外壳所使用的维度,该值的设置要与pcl::ConvexHull,pcl::ConcaveHull类所产生的多边形的维度一致。dim:点云滤波的多边形维度,取值为2 or 3。

void setCropOutside(bool crop_outside):设置滤除多边形内部的点还是外部的点,默认为true:滤除多边形外部的点。

10,clall pcl::ExtractIndice<PointT>:从一个点云中提取索引。:参考基类class pcl::FilterIndices<PointT>.

11,class pcl::Filter<PointT>,所有滤波模块的类都由此继承而来。

关键成员函数:

构造函数Filter(bool extract_removed_indices=false):为true:过滤掉的数据点索引保留且存在于一个单独的列表中,否则设置为false.

IndicesConstPtr constgetRemovedIndeces():获取滤除点的索引的指针。

12,clsaa pcl::FilterIndices<PointT>:剔除符合一定限定条件的点集的基类。

关键成员函数:

void filter(PointCloud &output):调用滤波方法并返回滤波后的点云结果。

void setNegative(bool negative):设置最终output点云返回滤波掉点还是保留点,negative==ture,则剔除滤波算法设计需要保留的点,negative==false,则剔除滤波算法设计要剔除的点。

void setKeepOrganized(bool keep_organized):设置是否保留原始点云结构。

其他可见基类 class pcl::Filter<PointT>

13,class pcl::VoxelGrid<PointT>:VoxelGrid类根据给定的点云构造一个三维体素栅格并进行下采样达到滤波的效果。将每个体素内的点都用该体素的重心近似,这样就大大减少了数据量。使用点云每个体素的重心来逼近点比使用体素中心的逼近方法更慢,但是重心采样得到的点表示曲面更加的准确。点云配准,曲面重建前的预处理工作:下采样通常使用该类。

关键成员函数:

void setLeafSize(const Eigen::Vector4f &leaf_size):通过向量设置体素栅格leaf_size.

void setLeafSize(float x,y,z):通过xyz分别设置体素栅格在XYZ3个方向的尺寸。

Eigen::Vector3i getGridCoordinates(float x,float y,float z):返回x,y,z坐标点对应的体素栅格的坐标。

void setDownsampleAllData(bool downsample):设置是否全字段下采样。

void setSaveLeafLayout(bool save_leaf_layout):是否保存叶结构信息以供将来访问,true:保留,false:不保留。

Eigen::Vector3i getMinBoxCoordinates():获取包围盒在3个方向的最小坐标。

Eigen::Vector3i getMaxBoxCoordinates():获取包围盒在3个方向的最大坐标。

Eigen::Vector3i getNrDivisions():滤波后得到3个方向上的分度数。

Eigen::Vector3i getDivisionMultiplier():获取体素索引与3个方向分度数之间转化的乘积系数。

int getCentroidIndex(const PointT &p):获取点p在体素栅格坐标下的一维索引。

Eigen::Vector3i getGridCoordinates(float x,float y,float z):返回在某(x,y,z)坐标点对应的体素栅格坐标(i,j,k)。体素栅格坐标是int类型的。                其他见基类Filter.

14,class pcl::RandomSample<PointT>:该类实现对点云的均匀概率随机采样。

关键成员函数:

void setSample(unsigned int sample):设置采样数目sample.

void setSeed(unsigend int seed):设置随机函数的种子。

void filter(PointCloud &output):执行按照滤波方法滤波输出滤波后的点云。

15,class pcl::StaticalOutlierRemoval<PointT>:通过查询点与邻域点集之间的距离统计判断需要滤除的点。

关键成员函数:

void setMeanK(int nr_k):设置用于计算平均距离估计时用的邻域点的数量nr_k.

void setStddevMulThresh(double std_mul):设置标准差倍数阈值std_mul,点云中所有的点与邻域的距离>u+-sita*std_mul则被认为是离散点。u:代表估计的平均距离,sita:代表标准差。

16,class pcl::NormalSpaceSampling<PointT,NormalT>:计算点云的每个点的法线,通过对法线的方向采样达到对点云采样的目的。

关键成员函数:

void setSample(unsigned int sample):设置要采样的索引的数量。

void setSeed(unsigned int seed):设置随机函数的种子。

void setBins(unsigned int binsx,unsigned int binsy,unsigned int binsz):分别设置X,Y,Z三个方向射线的数量binsx,binsy,binsz。

void setNormals(const NormalsPtr &normals):设置通过输入点云计算得到的法线。

其他可参考基类class  pcl::FilterIndices<PointT>

17,class pcl::PassThrough<PointT>:通过用户给定字段的限制对点云做滤波处理。例如过滤掉点云中X字段不在某个范围的点。

关键成员函数:

void setFilterFieldName(cosnt std::string &field_name):设置限定字段名称,例如“z”。

void setFilterLimits(const double &limit=DBL_MIN, const double &limit_max=DBL_MAX):设置限定区间,该区间范围外的点会被滤除。以上两个函数一起使用。

void getFilterLimitsNegative(bool &limit_negative):设置时返回限制条件外的点还是限制条件内的点。后续需要查看是否该方法已经被setNegative()函数取代。

其他见基类Filter<PointT>

18,class pcl::PlaneClipper3D<PointT>:在三维空间实现平面裁剪类。

void setPlaneParameters(const Eigen::Vector4f &plane_params):通过输入向量设置平面参数plane_params。其他可参见基类class pcl::Clipper3D。

19,class pcl::ProjectInliers<PointT>:使用一个模型和一组内点的索引,将内点投影到模型形成新的一个独立点云。

关键成员函数:

void setModelType(int model):通过用户给定的参数设置使用的模型,Model产看model_type.h。

void setModelCoefficients(const ModelCoefficientsConstPtr &model):设定指向模型系数的指针,model为指向模型系数的指针,对不同的模型有不同的系数对象。---可参考随机采样一致性。

void setCopyAllData(bool val):设置返回所有点还是返回投影内点后得到的点云,val=true表示返回所有点,val=false表示返回投影的内点。        其它参考基类class pcl::Filter<PointT>

void filter(PointCloud &output):获取滤波处理后的点云output。

20,class pcl::RadiusOutlierRemoval<PointT>:删除离群点的简单的滤波功能,如果查询点在给定的搜索半径范围内邻近点数量小于给定的阈值,则判断为离群点并删除。

关键成员函数:

void RadiusSearch(double radius):设置确定滤波的K近邻球的半径。

void setMinNeighborsInRadius(int min_pts):设置一个点在给定搜索半径内被认为是内部点所需要的最低近邻数量min_pts。

其他参考基类pcl::Filter<PointT>。

---------------------------------------------------------------------------------------------------------------参考于《点云库PCL学习教程》-郭浩主编

-----------------------------------------------------------------------------错误不足之处,请大家批评指正,后续会在学习过程中一直完善更新。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值