其他分享
首页 > 其他分享> > 三维重构(8):PCL点云滤波

三维重构(8):PCL点云滤波

作者:互联网

通过双目立体视觉得到的重构点云,一般具有较多的噪声点。造成这一现象的原因主要是,算法匹配点错误导致视差计算错误。SGBM算法是传统双目立体视觉中效果较好的,但是仍然具有较多的噪声点。所以我们希望通过滤波去除部分噪声点(毕竟不可能完全去除)

PCL滤波器

PCL中有多种滤波器比如:直通滤波、双边滤波、体素格滤波等。而此次去除离群点则使用了statisticalOutlierRemoval滤波器。同样可以被用来去除离群点的常用滤波器还有:ConditionalRemoval用来滤除不符合用户指定的一个或多个条件的所有点,或者RadiusOutlinerRemoval用于滤除一定半径范围内相邻点个数不大于选定阈值的点。

statisticalOutlierRemoval滤波

头文件:

#include<pcl/visualization/cloud_viewer.h>
#include<iostream>
#include<pcl/io/io.h>
#include<pcl/io/pcd_io.h>
#include<pcl/io/ply_io.h>
#include<pcl/point_types.h>
#include <pcl/filters/statistical_outlier_removal.h>

建立滤波器对象:

pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;

对该滤波器设置参数:

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
sor.setInputCloud(cloud);	//需要滤波的对象
sor.setMeanK(100);				//判断一个点是否离群参照的周边的点的个数
sor.setStddevMulThresh(0.1);//标准差阈值,去除标准差大的点

滤波,并保存结果:

	sor.filter(cloud_2);  //结果保存在cloud_2

滤波前后对比:

在这里插入图片描述在这里插入图片描述
由图可见:滤波后一些明显的离群点被滤除

ConditionalRemoval滤波

滤波条件:

pcl::ConditionAnd<pcl::PointXYZ>::Ptr Cond (new
      pcl::ConditionAnd<pcl::PointXYZ> ());

添加条件:

Cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new
      pcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::GT, 0.0)));   //Z字段上大于0
    Cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new
      pcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::LT, 0.6)));   //Z字段上小于0.8
   

执行滤波:

pcl::ConditionalRemoval<pcl::PointXYZ> condrem; //滤波器
    condrem.setCondition (range_cond);               
    condrem.setInputCloud (cloud);                   //输入点云
    condrem.setKeepOrganized(true);               //设置保持点云的结构
    // 执行滤波
    condrem.filter (cloud_2);

概率波器同样也比较简单粗暴,但是可以灵活添加滤波条件

RadiusOutlinerRemoval滤波

在一定搜索半径内寻找相邻点的个数,不符合条件的视为离群点

滤波过程类似statisticalOutlierRemoval

pcl::RadiusOutlierRemoval<pcl::PointXYZ> sor;  //创建滤波器
	sor.setInputCloud(cloud);   	 //滤波对象
     sor.setRadiusSearch(0.6);     	//在半径为0.6的范围内找临近点
	sor.setMinNeighborsInRadius(2); //临近点个数阈值,小于则被删除
	// apply filter
	sor.filter(cloud_2);
	*cloud = cloud_2;

该滤波器的对于离群点的处理比较简单粗暴,滤波效果不如statisticalOutlierRemoval

Summary

statisticalOutlierRemoval由于具有统计意义,更符合我当前的需求。

VeraWin 发布了30 篇原创文章 · 获赞 7 · 访问量 3073 私信 关注

标签:滤波器,PCL,滤波,sor,pcl,点云,include,cloud
来源: https://blog.csdn.net/TiffanyXYf/article/details/104428307