点云滤波(5)

点云滤波能达到的目的:去噪、去除离散点、抽稀(下采样)、平滑

直通滤波器--设定范围,对范围外点云进行滤除

//创建滤波器
pcl::PassThrough<pcl::PointXYZ> pass;
//输入原始点云
pass.setInputCloud(cloud);
//待筛选的属性,一般是对高度即z坐标做约束
pass.setFilterFieldName("z");
//设定接受范围
pass.setFilterLimits(-1.0,1.0);
//执行滤波
pass.filter(*cloud_filtered);

抽稀--设定体素,用体素中心属性代替整个体素内点云

//读取原始点云
pcl::PCDReader reader;
reader.read("***.pcd",*cloud1);

//创建滤波
pcl::VoxelGrid<sensor_msgs::PointCloud2> sor;
//输入原始点云
sor.setInputCloud(cloud1);
//设置体素大小
sor.setLeafSize(0.1f,0.1f,0.1f);
//执行滤波
sor.fileter(*cloud2);

//写出结果点云
pcl::PCDWriter writer;
writer.write("***.pcd",cloud2,Eigen::Vector4f::Zero(),Eigen::Quaternionf::Identity(),false);

去除离散点--即去除邻域范围内与平均距离超过阈值的点

//创建滤波器
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
//输入原始点云
sor.setInputCloud(cloud);
//邻域点数
sor.setMeanK(100);
//距离阈值
sor.setStddevMulThresh(0.1);
//执行滤波
sor.filter(*cloud_filtered);

条件滤波器--即去除不满足条件的点

//定义筛选条件
pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond(new pcl::ConditionAnd<pcl::PointXYZ>());
range_cond->addComprison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("z",pcl::ComparisonOps::GT,-1.0)));
range_cond->addComprison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("z",pcl::ComparisonOps::LT,1.0)));

//创建滤波器
pcl::ConditionalRemoval<pcl::PointXYZ> condrem(range_cond);
//输入原始点云
condrem.setInputCloud(cloud);
//保持点云结构
condrem.setKeepOrganized(true);
//执行滤波
condrem.filter(*cloud_filtered);

距离滤波器--即滤除在距离范围内邻域点不足的点

//创建滤波器
pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
//输入原始点云
outrem.setInputCloud(cloud);
//设置距离范围
outrem.setRadiusSearch(1.0);
//设置邻域点数阈值
outrem.setMinNeighborsInRadius(10);
//执行滤波
outrem.filter(*cloud_filtered);

投影滤波--将点云投影到相应模型上

//定义投影模型,下面以一个平面举例
pcl::ModelCoefficients::Ptr coef(new pcl::ModelCoefficients());
coef->values.resize(4);
coef->values[0] = A;
coef->values[1] = B;
coef->values[2] = C;
coef->values[3] = D;

//创建投影滤波
pcl::ProjectInliers<pcl::PointXYZ> proj;
//设定投影模型
proj.setModelType(pcl::SACMODEL_PLANE);
//输入原始点云
proj.setInputCloud(cloud);
//输入模型系数
proj.setModelCoefficients(coef);
//执行滤波
proj.filter(*cloud_filtered);

点云分割--例如筛选与一个平面相距阈值范围内点云

pcl::ModelCoefficients::Ptr coef(new pcl::ModelCoefficiens());
pcl::PointIndices::Ptr inliers(new pcl::PointIndices());

//创建分割对象
pcl::SACSegmentation<pcl::PointXYZ> seg;
//设置分割模型
seg.setModelType(pcl::SACMODEL_PLANE);
//设置参数估计方法
seg.setMethodType(pcl::SAC_RANSAC);
//设置迭代次数
seg.setMaxIterations(1000);
//设置模型内距离阈值
seg.setDistanceThreshold(0.1);
//执行分割
seg.setInputCloud(cloud);
seg.segment(*inliers,*coef);

//创建点云筛选器
pcl::ExtractIndices<pcl::PointXYZ> extract;
//输入原始点云
extract.setInputCloud(cloud);
//设置筛选结果点云序号
extract.setIndices(inliers);
//执行筛选
extract.filter(*cloud2);

多边形范围内点云提取

//创建多边形对象
pcl::ConvexHull<pcl::PointXYZ> hull;
//输入多边形对象对应点云
hull.setInputCloud(hull_cloud);
//设置多边形约束的维度
hull.setDimension(2);
//声明多边形顶点与形状变量
std::vector<pcl::Vertices> hull_polygons;
pcl::PointCloud<pcl::PointXYZ>::Ptr hull_surface(new PointCloud<pcl::PointXYZ>);
hull.reconstruct(*hull_surface,*hull_polygons);

//创建滤波
pcl::CropHull<pcl::PointXYZ> crop;
//输入原始点云
crop.setInputCloud(cloud);
//输入顶点与形状
crop.setHullIndices(hull_polygons);
crop.setHullCloud(hull_surface);
//执行滤波
crop.filter(*cloud_filtered);

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值