PCL使用VoxelGrid进行点云采样

#include<iostream>
#include<pcl/point_types.h>
#include<pcl/filters/voxel_grid.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_filter(new pcl::PointCloud<pcl::PointXYZ>);
	//sensor_msgs::PointCloud2::Ptr cloud(new sensor_msgs::PointCloud2);
	//sensor_msgs::PointCloud2::Ptr my_cloud_filter(new sensor_msgs::PointCloud2);
	pcl::PCDReader reader;
	reader.read("E:\\vs_code\\my_cylinder.pcd",*my_cloud);
	//pcl::VoxelGrid<sensor_msgs::PointCloud2> my_voxel_fliter;
	pcl::VoxelGrid<pcl::PointXYZ> my_voxel_fliter;
	my_voxel_fliter.setInputCloud(my_cloud);
	my_voxel_fliter.setLeafSize(1.0f,1.0f,1.0f);
	my_voxel_fliter.filter(*my_cloud_filter);
	pcl::visualization::PCLVisualizer my_viewer1;
	pcl::visualization::PCLVisualizer my_viewer2;
	my_viewer1.addPointCloud(my_cloud);
	my_viewer2.addPointCloud(my_cloud_filter);
	while(!my_viewer1.wasStopped())
	{
		my_viewer1.spinOnce(100);
		my_viewer1.spinOnce(100);
	}
	pcl::PCDWriter writer;
	writer.write("my_filter.pcd",*my_cloud_filter);
	return 0;
}

和上一篇的直通滤波差不多,都是读点云,设置参数,进行计算,输出结果。
这里为了能够显示点云,对PCL书里的代码进行了修改

	pcl::VoxelGrid<pcl::PointXYZ> my_voxel_fliter;
	my_voxel_fliter.setInputCloud(my_cloud);
	my_voxel_fliter.setLeafSize(1.0f,1.0f,1.0f);
	my_voxel_fliter.filter(*my_cloud_filter);

这里设置的三维栅格参数比较重要,过小会导致降采样效果不明显,过大又会导致特征的明显缺失
最后的结果如下
在这里插入图片描述

PCL(Point Cloud Library)是一个开源的点云处理库,提供了丰富的点云处理算法和工具。点云采样点云处理中的一项重要任务,它可以减少点云数据的数量,从而降低计算和存储的成本,并且可以去除一些噪声点。 在PCL中,点云采样可以通过使用VoxelGrid滤波器来实现。VoxelGrid滤波器将点云划分为一个个体素(或称为体素格子),然后对每个体素内的点进行采样,只保留一个代表性的点作为该体素的代表点。这样就可以将原始的稠密点云转换为稀疏的点云,从而实现降采样的效果。 以下是使用PCL进行点云采样的步骤: 1. 创建一个VoxelGrid滤波器对象。 2. 设置滤波器的输入点云数据。 3. 设置滤波器的体素大小,即决定了降采样后的点云密度。 4. 调用滤波器的filter()函数进行采样操作。 5. 获取滤波器的输出点云数据。 下面是一个示例代码片段,展示了如何使用PCL进行点云采样: ```cpp #include <pcl/point_cloud.h> #include <pcl/filters/voxel_grid.h> int main() { // 创建点云对象 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // 读取点云数据 // 创建VoxelGrid滤波器对象 pcl::VoxelGrid<pcl::PointXYZ> voxelGrid; // 设置输入点云数据 voxelGrid.setInputCloud(cloud); // 设置体素大小 voxelGrid.setLeafSize(0.01f, 0.01f, 0.01f); // 体素大小为1cm // 执行降采样操作 pcl::PointCloud<pcl::PointXYZ>::Ptr filteredCloud(new pcl::PointCloud<pcl::PointXYZ>); voxelGrid.filter(*filteredCloud); // 获取降采样后的点云数据 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值