StatisticalOutlierRemoval
StatisticalOutlierRemoval是用来去除点云数据中的离群点(噪点),使用的方法为:对于每个点的,计算它到它所有临近点的平均距离,假设得到的是一个高斯分布,那么根据均值与标准差,平均距离在标准范围外的点,就是离群点
代码
#include <iostream>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/octree/octree.h>
#include <boost/thread/thread.hpp>
#include <pcl/common/common_headers.h>
#include <pcl/features/normal_3d.h>
#include <pcl/console/parse.h>
#include <pcl/filters/passthrough.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/statistical_outlier_removal.h>
//#include <bits/stdc++.h>
#include <vector>
#include <ctime>
using namespace std;
int main()
{
pcl::visualization::CloudViewer viewer("Cloud Viewer");
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>());
if (pcl::io::loadPCDFile<pcl::PointXYZ> ("table_scene_lms400_far_ranges.pcd", *cloud) == -1){
PCL_ERROR("couldn't read file");
return 0;
}
cerr<<"cloud before filtering"<<endl;
cerr<<cloud->points.size()<<endl;
cerr<<cloud->height<<" "<<cloud->width<<endl;
pcl::StatisticalOutlierRemoval<pcl::PointXYZ>sor;
sor.setInputCloud(cloud);
sor.setMeanK(50);
sor.setStddevMulThresh(1.0);
sor.filter(*cloud_filtered);
cerr<<"cloud after filtering"<<endl;
cerr<<cloud_filtered->points.size()<<endl;
cerr<<cloud_filtered->height<<" "<<cloud_filtered->width<<endl;
viewer.showCloud(cloud_filtered);
while(!viewer.wasStopped());
return 0;
}