目录
PCL去除离群点StatisticalOutlierRemoval使用方法和效果显示
去除离群点StatisticalOutlierRemoval原理说明
去除离群点StatisticalOutlierRemoval适用情况和使用感受
PCL去除离群点StatisticalOutlierRemoval使用方法和效果显示
所需点云资源见文章末尾的参考链接;
程序写了去除离群点的基本操作方法,并且显示每一步的运行效果,在运行时关闭一个窗口后,再显示下一个点云窗口;
算法本身主要参数:
(1)设置参考周围点的个数,这里设置50.
(2)假设该点与周围参考点的符合正态分布,在几个标准差之内则留下,这里设置1.0;
/*20201323 by 手口一斤*/
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/common/common_headers.h>
#include <boost/thread/thread.hpp>
int
main(int argc, char** argv)
{
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<pcl::PointXYZ>("table_scene_lms400.pcd", *cloud);
std::cerr << "Cloud before filtering: " << std::endl;
std::cerr << *cloud << std::endl;
pcl::visualization::CloudViewer viewerori("ori cloud");
viewerori.showCloud(cloud, "ori cloud");
while (!viewerori.wasStopped())
{
boost::this_thread::sleep(boost::posix_time::microseconds(10000));
}
// Create the filtering object
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud(cloud);
sor.setMeanK(50);
sor.setStddevMulThresh(1.0);
sor.filter(*cloud_filtered);
std::cerr << "Cloud after filtering: " << std::endl;
std::cerr << *cloud_filtered << std::endl;
pcl::visualization::CloudViewer viewer("after filtered");
viewer.showCloud(cloud_filtered, "cloud filtered0");
while (!viewer.wasStopped())
{
boost::this_thread::sleep(boost::posix_time::microseconds(10000));
}
sor.setNegative(true);
sor.filter(*cloud_filtered);//input 还是cloud,所以可以这样
pcl::visualization::CloudViewer viewer1("points be filtered");
viewer1.showCloud(cloud_filtered, "cloud filtered1");
while (!viewer1.wasStopped())
{
boost::this_thread::sleep(boost::posix_time::microseconds(10000));
}
return (0);
}
算法运行结果:
第一个窗口显示源图:
关闭后,第二个窗口显示滤波之后的点云
关闭后,第三个窗口显示被滤掉的点:
去除离群点StatisticalOutlierRemoval原理说明
首先,针对每一个点,把该点和其距离最近的N个点组成一个点集合;假设这个点集符合正态分布,计算该点集合的均值和标准差;如果该点在预先设置的标准差范围内,例如一个标准差内,则保留该点否则去掉;
去除离群点StatisticalOutlierRemoval适用情况和使用感受
去除离群点适合去除异常噪声点,尤其是在激光扫描产生点云不均匀的时候;
适合去除因为误差取得的异常点云点;
去除离群点之后的点云比较平滑,适合进行下一步点云聚类处理,比较容易收敛;