PCL使用RadiusOutlierRemoval进行过滤

这篇博客记录了使用PCL库进行点云处理的过程,特别是通过RadiusOutlierRemoval算法去除噪声点。作者初始化了一个随机点云,设置搜索半径为100,并要求每个点周围至少有3个邻居点,以此来过滤异常值。在调试过程中,通过调整参数和实时查看可视化结果,解决了点云显示问题。最后展示了输入和输出点云的数目,并通过PCLVisualizer进行可视化验证效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <pcl/point_types.h>
#include <pcl/filters/radius_outlier_removal.h>
#include <pcl/filters/conditional_removal.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>
int	main (int argc, char** argv)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr my_cloud (new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PointCloud<pcl::PointXYZ>::Ptr my_cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);

	//pcl::PCDReader my_reader;
	//my_reader.read<pcl::PointXYZ>("E:\\vs_code\\hello_pcl\\hello_pcl\\table_scene_lms400.pcd",*my_cloud);
	my_cloud->width = 1000;
	my_cloud->height = 1;
	my_cloud->points.resize(my_cloud->width*my_cloud->height);
	for (size_t i = 0; i < my_cloud->points.size(); ++i)
	{
		my_cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
		my_cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
		my_cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
	}

	for (size_t i = 0; i < my_cloud->points.size(); ++i)
	{
		std::cout<<my_cloud->points[i].x<<" "
			<<my_cloud->points[i].y<<" "
			<<my_cloud->points[i].z<<std::endl;
	}

	pcl::RadiusOutlierRemoval<pcl::PointXYZ> routrem;
	routrem.setInputCloud(my_cloud);
	routrem.setRadiusSearch(100);
	routrem.setMinNeighborsInRadius(3);
	routrem.filter(*my_cloud_filtered);

	std::cout<<"输入的点云个数: "<<my_cloud->points.size()<<std::endl;
	std::cout<<"输出的点云个数: "<<my_cloud_filtered->points.size()<<std::endl;

	pcl::visualization::PCLVisualizer my_viewer1;
	pcl::visualization::PCLVisualizer my_viewer2; 
	my_viewer1.addPointCloud(my_cloud);
	my_viewer2.addPointCloud(my_cloud_filtered);
	while(!my_viewer1.wasStopped())
	{
		my_viewer1.spinOnce(100);
		my_viewer1.spinOnce(100);
	}
	return (0);
}

虽然代码不多,但是还是遇到了一些坑,这里做个简单的记录,写写心得

	pcl::RadiusOutlierRemoval<pcl::PointXYZ> routrem;
	routrem.setInputCloud(my_cloud);
	routrem.setRadiusSearch(100);
	routrem.setMinNeighborsInRadius(3);
	routrem.filter(*my_cloud_filtered);

这一块就是核心的内容了,依旧是设置点云、计算结果,不同之处就是设置了:搜索半径范围、半径内最小的点数,就是说:在设置的100的半径范围内,对于临近点少于3个的点,进行去除

这里记录一点心得,起初我是按照别人的教程来的,设置的搜索半径太小,记得是0.3吧,然后运行好几次都没有点显示,最后我就加了循环,看看生成的点的半径是什么样子,这确实是一个调试的好方法,及时看看输出的结果!
另外的话,可以看到,我每次都是利用可视化把结果显示了,我觉得这也是一个很好的调试方法

最后放一下输出的结果
原始点云
过滤之后的点云图
终端输出

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值