【PCL】点云直通滤波&半径滤波&统计滤波

在这里插入图片描述

开发环境:Visual Studio 2017
PCL版本:PCL 1.8.1

1.点云直通滤波

点云直通滤波源代码:(滤波参数根据实际情况调整)

#include <iostream>
#include <vector>
#include <math.h>
#include <pcl/common/transforms.h>
#include <pcl/common/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/filters/radius_outlier_removal.h> //半径滤波器头文件
#include <pcl/filters/voxel_grid.h>//体素滤波器头文件
#include <pcl/filters/passthrough.h>  //直通滤波器头文件
#include <pcl/filters/statistical_outlier_removal.h> //统计滤波器头文件
#include <pcl/filters/conditional_removal.h> //条件滤波器头文件

int main(int argc, char** argv)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr src_xyz(new pcl::PointCloud<pcl::PointXYZ>);//原始点云
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_pass_filtered(new pcl::PointCloud<pcl::PointXYZ>);//直通滤波后点云

	if (-1 == pcl::io::loadPLYFile("E:/bishe/radius_filter_20_3.ply", *src_xyz)) 
	{
		cout << "Error Load Src File!\n" << endl;
		return -1;
	}
	else cout << "Load Src File Success!\n" << endl;
	cout << "Src Point Cloud Point Numbers: " << src_xyz->points.size() << "\n" << endl;//输出原始点云数量

    //直通滤波,指定x轴方向
	pcl::PassThrough<pcl::PointXYZ> pass;//创建直通滤波器
	pass.setInputCloud(src_xyz);//输入点云
	pass.setFilterFieldName("x");//设置滤波的方向x轴
	pass.setFilterLimits(-10, 10);//滤除在z轴方向上不在0.0-0.1范围内的所有点
	//pass.setFilterLimitsNegative (true);//默认false,保留内部
	pass.filter(*cloud_pass_filtered);//滤波结果输出
	cout << "cloud_pass_filtered Point Cloud Point Numbers: " << cloud_pass_filtered->points.size() << "\n" << endl;

	//直通滤波,指定y轴方向
	pcl::PassThrough<pcl::PointXYZ> pass2;//创建直通滤波器
	pass.setInputCloud(cloud_pass_filtered);//输入点云
	pass.setFilterFieldName("y");//设置滤波的方向y轴
	pass.setFilterLimits(-10, 10);//滤除在z轴方向上不在0.0-0.1范围内的所有点
	//pass.setFilterLimitsNegative (true);//默认false,保留内部
	pass.filter(*cloud_pass_filtered);//滤波结果输出
	cout << "cloud_pass_filtered Point Cloud Point Numbers: " << cloud_pass_filtered->points.size() << "\n" << endl;

	//点云可视化
	pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
	int v1;
	viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
	viewer->addCoordinateSystem(10, v1);
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> red(src_xyz, 255, 0, 0);
	viewer->addPointCloud(src_xyz, red, "src", v1);

	int v2;
	viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);
	viewer->addCoordinateSystem(10, v2);
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> green(cloud_pass_filtered, 0, 255, 0);
	viewer->addPointCloud(cloud_pass_filtered, green, "cloud_filtered", v2);

	//pcl::io::savePLYFile("E:/vc2017project/cloud_pass_filter.ply", *cloud_pass_filtered);//存储直通滤波后的点云

	while (!viewer->wasStopped())
	{
		viewer->spinOnce();
	}

	cout << "Filter Success!\n" << endl;
	return 0;
}

分别对点云的x轴和y轴进行滤波,滤波效果:
在这里插入图片描述

2.点云半径滤波

点云半径滤波主程序源代码:(滤波参数根据实际情况调整)

int main(int argc, char** argv)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr src_xyz(new pcl::PointCloud<pcl::PointXYZ>);//原始点云
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_radius_filter(new pcl::PointCloud<pcl::PointXYZ>);//半径滤波后的点云

	if (-1 == pcl::io::loadPLYFile("E:/vc2017project/src.ply", *src_xyz)) 
	{
		cout << "Error Load Src File!\n" << endl;
		return -1;
	}
	else cout << "Load Src File Success!\n" << endl;
	cout << "Src Point Cloud Point Numbers: " << src_xyz->points.size() << "\n" << endl;//输出原始点云数量

	//半径滤波
	pcl::RadiusOutlierRemoval<pcl::PointXYZ> radiusoutlier;  //创建半径滤波器
	radiusoutlier.setInputCloud(src_xyz); //输入点云
	radiusoutlier.setRadiusSearch(0.5);   //搜索半径
	radiusoutlier.setMinNeighborsInRadius(5);//邻域点阈值
	radiusoutlier.filter(*cloud_radius_filter);
	cout << "cloud_radius_filter Point Cloud Point Numbers: " << cloud_radius_filter->points.size() << "\n" << endl;
	
	//点云可视化
	pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
	int v1;
	viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
	viewer->addCoordinateSystem(10, v1);
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> red(src_xyz, 255, 0, 0);
	viewer->addPointCloud(src_xyz, red, "src", v1);

	int v2;
	viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);
	viewer->addCoordinateSystem(10, v2);
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> green(cloud_radius_filter, 0, 255, 0);
	viewer->addPointCloud(cloud_radius_filter, green, "cloud_filtered", v2);

	//pcl::io::savePLYFile("E:/vc2017project/cloud_radius_filter.ply", *cloud_radius_filter);//存储半径滤波后的点云

	while (!viewer->wasStopped())
	{
		viewer->spinOnce();
	}

	cout << "Filter Success!\n" << endl;
	return 0;
}

半径滤波效果:
在这里插入图片描述

3.点云统计滤波

点云统计滤波主程序源代码:(滤波参数根据实际情况调整)

int main(int argc, char** argv)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr src_xyz(new pcl::PointCloud<pcl::PointXYZ>);//原始点云
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_statistic_filter(new pcl::PointCloud<pcl::PointXYZ>);//半径滤波后的点云

	if (-1 == pcl::io::loadPLYFile("E:/vc2017project/src.ply", *src_xyz)) 
	{
		cout << "Error Load Src File!\n" << endl;
		return -1;
	}
	else cout << "Load Src File Success!\n" << endl;
	cout << "Src Point Cloud Point Numbers: " << src_xyz->points.size() << "\n" << endl;//输出原始点云数量
	
	//统计滤波
	pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;	//创建滤波器对象
	sor.setInputCloud(src_xyz);	//输入点云
	sor.setMeanK(7);			//近邻点个数
	sor.setStddevMulThresh(0.5);//设置标准差乘数
	sor.filter(*cloud_statistic_filter);//保存滤波结果
	cout << "cloud_statistic_filter Point Cloud Point Numbers: " << cloud_statistic_filter->points.size() << "\n" << endl;
	
	//点云可视化
	pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
	int v1;
	viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
	viewer->addCoordinateSystem(10, v1);
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> red(src_xyz, 255, 0, 0);
	viewer->addPointCloud(src_xyz, red, "src", v1);

	int v2;
	viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);
	viewer->addCoordinateSystem(10, v2);
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> green(cloud_statistic_filter, 0, 255, 0);
	viewer->addPointCloud(cloud_statistic_filter, green, "cloud_filtered", v2);

	//pcl::io::savePLYFile("E:/bishe/tongji_filter_15_5.ply", *cloud_tongji_filter);

	while (!viewer->wasStopped())
	{
		viewer->spinOnce();
	}

	cout << "Filter Success!\n" << endl;
	return 0;
}

统计滤波效果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值