//
// Created by xuming on 21-5-27.
//
#include <iostream>
#include <vector>
#include <ctime>
#include <pcl-1.11/pcl/io/pcd_io.h>
#include <pcl-1.11/pcl/point_types.h>
#include <pcl-1.11/pcl/filters/statistical_outlier_removal.h>
/*!
* 统计分析技术,从一个点云数据集中,移除测量噪声点.
* 激光扫描,通常会产生密度不均匀的点云数据集,另外测量中的误差会产生洗漱的离群点
* 使用效果更糟糕,估计点云局部特征,(例如采样点处的大向量或曲率变化率)
* 运算很复杂,这会导致错误的数值,反过来有可能导致点云的配准等后期处理失败.
*
*
* 以下方法可以解决其中部分问题
* 对每个点的邻域进行一个统计分析,并修剪掉一些不符合一定标准的点 我们的稀疏离群点,
* 移除方法基于在输入数据中对点到距离临近点的分布的计算. 对每个点,我们计算它的所有临近点的平均距离.
* 假设得到的一个结果是一个高斯分布,其形状由均值和标准差决定,平均距离在标准范围之外的点,
* 可被定义为离群点兵可从数据集中移除
*
*/
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCDReader reader;
// 把路径改为自己存放的路径
reader.read("table_scene_lms400.pcd",*cloud);
std::cout << "PointCloud before filtering: "
<< cloud->width * cloud->height
<< " data points ("
<< pcl::getFieldsList (*cloud)
<< ")."
<< std::endl;
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; // 创建滤波对象
sor.setInputCloud(cloud); // 设置待滤波的点云
sor.setMeanK(50); // 设置正在济宁统计时考虑查询点临近点
sor.setStddevMulThresh(1.0); // 判断是否为离群点的阈值
sor.filter(*cloud_filtered); // 执行滤波处理保存内点到 cloud_filtered
std::cout << "PointCloud after filtering: "
<< cloud_filtered->width * cloud_filtered->height
<< " data points ("
<< pcl::getFieldsList (*cloud_filtered)
<< ")."
<< std::endl;
// 最后将点云写入磁盘并输出
pcl::PCDWriter writer;
writer.write("table_scene_lms400_lms400_inliers.pcd", *cloud_filtered, false);
return 0;
}
滤波之前
滤波之后