PCL点云滤波:去除离群点StatisticalOutlierRemoval和适用场景

目录

PCL去除离群点StatisticalOutlierRemoval使用方法和效果显示

去除离群点StatisticalOutlierRemoval原理说明

去除离群点StatisticalOutlierRemoval适用情况和使用感受


PCL去除离群点StatisticalOutlierRemoval使用方法和效果显示

所需点云资源见文章末尾的参考链接;

程序写了去除离群点的基本操作方法,并且显示每一步的运行效果,在运行时关闭一个窗口后,再显示下一个点云窗口;

算法本身主要参数:

(1)设置参考周围点的个数,这里设置50.

(2)假设该点与周围参考点的符合正态分布,在几个标准差之内则留下,这里设置1.0;

/*20201323 by 手口一斤*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int
main(int argc, char** argv)
{
	pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
	pcl::PointCloud::Ptr cloud_filtered(new pcl::PointCloud);

	pcl::PCDReader reader;
	reader.read("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 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);
}

算法运行结果:

第一个窗口显示源图:

PCL点云滤波:去除离群点StatisticalOutlierRemoval和适用场景_第1张图片

关闭后,第二个窗口显示滤波之后的点云

PCL点云滤波:去除离群点StatisticalOutlierRemoval和适用场景_第2张图片

关闭后,第三个窗口显示被滤掉的点:

PCL点云滤波:去除离群点StatisticalOutlierRemoval和适用场景_第3张图片

去除离群点StatisticalOutlierRemoval原理说明

首先,针对每一个点,把该点和其距离最近的N个点组成一个点集合;假设这个点集符合正态分布,计算该点集合的均值和标准差;如果该点在预先设置的标准差范围内,例如一个标准差内,则保留该点否则去掉;

去除离群点StatisticalOutlierRemoval适用情况和使用感受

去除离群点适合去除异常噪声点,尤其是在激光扫描产生点云不均匀的时候;

适合去除因为误差取得的异常点云点;

去除离群点之后的点云比较平滑,适合进行下一步点云聚类处理,比较容易收敛;

参考:https://pcl.readthedocs.io/projects/tutorials/en/latest/statistical_outlier.html#statistical-outlier-removal

你可能感兴趣的:(PCL,c++,算法,计算机视觉,图像处理)