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

目录

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适用情况和使用感受

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

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

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

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

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值