青海公路建设信息服务网站,wordpress火车头接口,wordpress网页源代码,wordpress最好的插件前言
点云滤波作为常见的点云处理算法#xff0c;一般是点云处理的第一步#xff0c;对后续处理有很重要作用。滤波 有很多方面也有很多种功能#xff0c;比如去除噪声点、离群点、点云平滑以及空洞、数据压缩等
原始点云数据往往包含大量散列点、孤立点#xff0c;在获取…前言
点云滤波作为常见的点云处理算法一般是点云处理的第一步对后续处理有很重要作用。滤波 有很多方面也有很多种功能比如去除噪声点、离群点、点云平滑以及空洞、数据压缩等
原始点云数据往往包含大量散列点、孤立点在获取点云数据时由于设备精度操作者经验环 境因素带来的影响以及电磁波的衍射性被测物体表面性质变化和数据拼接配准操作过程的影 响点云数据中讲不可避免的出现一些噪声而且采样的分辨率也不同
1直通滤波器
直通滤波器就是根据点云的属性在点的属性上设置范围对点进行滤波保留范围内的 或保留范围外的。 1指定一个维度以及该维度下的值域 2遍历点云中的每个点判断该点在指定维度上的取值 是否在值域内删除取值不在值域内的点 3遍历结束留下的点即构成滤波后的点云。
#include pcl/filters/passthrough.h// 原点云获取后进行滤波
pcl::PassThroughpcl::PointXYZ pass;// 创建滤波器对象
pass.setInputCloud (cloud);//设置输入点云
pass.setFilterFieldName (z);//滤波字段名被设置为Z轴方向
pass.setFilterLimits (0.0, 1.0);//可接受的范围为0.01.0//pass.setFilterLimitsNegative (true);//设置保留范围内 还是 过滤掉范围内
pass.filter (*cloud_filtered); //执行滤波保存过滤结果在cloud_filtered2体素滤波器下采样
体素滤波器可以达到向下采样同时不破坏点云本身几何结构的功能但是会移动点的位置。 此外体素滤波器可以去除一定程度的噪音点及离群点。主要功能是用来进行降采样。 1它的原理是根据输入的点云首先计算一个能够刚好包裹住该点云的立方体然后根据设定的分辨率将该大 立方体分割成不同的小立方体。对于每一个小立方体内的点计算他们的质心并用该质心的坐标来近似该立方体 内的若干点。 2ApproximateVoxelGrid的不同在于这种方法是利用每一个小立方体的中心来近似该立方体内的若干点。相比于 VoxelGrid计算速度稍快但也损失了原始点云局部形态的精细度。
#include pcl/filters/voxel_grid.h // VoxelGrid
pcl::VoxelGridpcl::PCLPointCloud2 sor;
sor.setInputCloud (cloud);
sor.setLeafSize (0.01f, 0.01f, 0.01f);
sor.filter (*cloud_filtered);
// Approximate 体素格滤波器 pcl::ApproximateVoxelGridpcl::PointXYZ approximate_voxel_filter;
approximate_voxel_filter.setLeafSize (0.2, 0.2, 0.2);
approximate_voxel_filter.setInputCloud (input_cloud);
approximate_voxel_filter.filter (*filtered_cloud);3均匀采样滤波器下采样
均匀采样滤波基本上等同于体素滤波器但是其不改变点的位置。下采样后其点云分布基本 均匀但是其点云的准确度要好于体素滤波因为没有移动点的位置。 均匀采样算法均匀采样通过构建指定半径的球体对点云进行下采样滤波将每一个球内距离球体中心最 近的点作为下采样之后的点输出。
#include pcl/keypoints/uniform_sampling.h // Uniform sampling
object. pcl::UniformSamplingpcl::PointXYZ filter;
filter.setInputCloud(cloud);
filter.setRadiusSearch(0.01f);
// We need an additional object to store the indices of surviving
points. pcl::PointCloudint keypointIndices;
filter.compute(keypointIndices);4统计滤波器去噪
#include pcl/filters/statistical_outlier_removal.h
pcl::StatisticalOutlierRemovalpcl::PointXYZ sor;
sor.setInputCloud (cloud);
sor.setMeanK (50); //设置考虑查询点临近点数
sor.setStddevMulThresh (1.0);//设置判断是否为离群点的阀值
sor.filter (*cloud_filtered);
// 然后使用同样的参数再次调用该滤波器但是利用函数setNegative设 置使输出取外点以获取离群点数据(也就是原本滤除掉的点)。
sor.setNegative (true);
sor.filter (*cloud_filtered);5统计滤波
条件滤波器通过设定滤波条件进行滤波删除不符合用户指定的一个或者多个条件 直通滤波器是一种较简单的条件滤波器。
#include pcl/filters/conditional_removal.h
pcl::ConditionAndpcl::PointXYZ::Ptr range_cond (new pcl::ConditionAndpcl::PointXYZ ()); //创建条件定义对象 //添加在Z字段上大于0的比较算子
range_condaddComparison (pcl::FieldComparisonpcl::PointXYZ::ConstPtr (new pcl::FieldComparison pcl::PointXYZ (z, pcl::ComparisonOps::GT, 0.0))); //添加在Z字段上小于0.8的比较算子
range_condaddComparison (pcl::FieldComparisonpcl::PointXYZ::ConstPtr (new pcl::FieldComparison pcl::PointXYZ (z, pcl::ComparisonOps::LT, 0.8))); // 创建滤波器并用条件定义对象初始化
pcl::ConditionalRemovalpcl::PointXYZ condrem;
condrem.setCondition (range_cond);
condrem.setInputCloud (cloud);
condrem.setKeepOrganized(true); //设置保持点云的结构
condrem.filter (*cloud_filtered); // 执行滤波6半径滤波去噪
半径滤波器以某点为中心画一个圆计算落在该圆中点的数量当数量大于给定值时则保留该 点数量小于给定值则剔除该点。 主要还是用于去除离群点在一定程度上可以用来筛选边缘点。
#include pcl/filters/radius_outlier_removal.h pcl::RadiusOutlierRemovalpcl::PointXYZ outrem;
outrem.setInputCloud(cloud);
outrem.setRadiusSearch(0.8);//设置半径为0.8的范围内找临 *点
outrem.setMinNeighborsInRadius (2);//设置查询点的邻域点 集数小于2的删除
outrem.filter (*cloud_filtered); //在半径为0.8 在此半径内必须要有两个邻居点此点才会保存7投影滤波
将点投影到一个参数化模型上这个参数化模型可以是平面、圆球、圆柱、锥形等进行投影滤波。 把三维点云投影到二维图像上然后用图像处理的方法进行处理。
// 填充ModelCoefficients的值,使用axbyczd0平面模型其中 abd0,c1 也就是X——Y平面 //定义模型系数对象并填充对应的数据
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients()); coefficients-values.resize(4);
coefficients-values[0] coefficients-values[1] 0;
coefficients-values[2] 1.0; coefficients-values[3] 0;
// 创建ProjectInliers对象使用ModelCoefficients作为投影对象的模型参数
pcl::ProjectInlierspcl::PointXYZ proj;
//创建投影滤波对象
proj.setModelType(pcl::SACMODEL_PLANE);
proj.setInputCloud(cloud);
proj.setModelCoefficients(coefficients);
proj.filter(*cloud_projected);
//设置对象对应的投影模型 //设置输入点云
//设置模型对应的系数
//投影结果存储8模型滤波
根据点到模型的距离设置距离阈值过滤非模型点, 基于模型的点分割操作将模型外的点从点云中剔除
//x^2 y^2 z^2 1
pcl::ModelCoefficients sphere_coeff;
sphere_coeff.values.resize (4); sphere_coeff.values[0] 0;
sphere_coeff.values[1] 0;
sphere_coeff.values[2] 0;
sphere_coeff.values[3] 1;
pcl::ModelOutlierRemovalpcl::PointXYZ sphere_filter;
sphere_filter.setModelCoefficients (sphere_coeff);
sphere_filter.setThreshold (0.05);
sphere_filter.setModelType (pcl::SACMODEL_SPHERE);
sphere_filter.setInputCloud (cloud);
sphere_filter.filter (*cloud_sphere_filtered);9高斯滤波去噪、平滑
GaussianKernel是基于高斯核的卷积滤波实现高斯过滤器相当于一个具有平滑性能的低通滤波器 通过该类处理后的点云相对比较平滑
pcl::filters::Convolutionpcl::PointXYZRGB , pcl::PointXYZRGB convolution;
Eigen::ArrayXf gaussian_kernel(5); gaussian_kernel 1.f/16, 1.f/4, 3.f/8, 1 .f/4, 1.f/16;
convolution.setBordersPolicy(pcl::filters: :Convolutionpcl::PointXYZRGB, pcl::PointX YZRGB::BORDERS_POLICY_IGNORE);
convolution.setDistanceThreshold (static_c astfloat (0.1));
convolution.setInputCloud (inputCloud);
convolution.setKernel (gaussian_kernel);
convolution.convolve(*cloud);10双边滤波平滑
双边滤波是一种非线性滤波器它可以达到保持边缘、降噪平滑的效果。一定程度上拟补了高斯滤波的缺点。 双边滤波对高斯噪声效果比较好。
11形态学滤波
主要为了有效的分割出地平面的点云
12渐进三角网加密滤波(PTD) 13布料滤波