PCL:VoxelGrid ❤️ 点云体素下采样

Posted 没事就要敲代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PCL:VoxelGrid ❤️ 点云体素下采样相关的知识,希望对你有一定的参考价值。

1 原理

对点云数据创建一个三维体素栅格(微小的空间三维立方体的集合),用每个体素重心近似代替体素中的其他点。这种方法比用体素中心来逼近的方法更慢,但它对于采样点对应曲面的表示更为准确。

2 代码实现

代码:

#include <iostream>
#include <pcl\\io\\pcd_io.h>
#include <pcl\\filters\\voxel_grid.h>

using namespace std;

typedef pcl::PointXYZ PointT;

int main()
{
	//------------------------------------ 加载点云 ---------------------------------
	pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
	pcl::PCDReader reader;	
	if (reader.read("bunny.pcd", *cloud) < 0)
	{
		PCL_ERROR("\\a->点云文件不存在!\\n");
		system("pause");
		return -1;
	}
	cout << "->加载了 " << cloud->points.size() << " 个数据点" << endl;
	//==============================================================================

	//---------------------------------- 体素下采样 --------------------------------
	pcl::PointCloud<PointT>::Ptr cloud_filtered(new pcl::PointCloud<PointT>);
	pcl::VoxelGrid<pcl::PointXYZ> vg;		//创建滤波器对象
	vg.setInputCloud(cloud);				//设置待滤波点云
	vg.setLeafSize(0.005f, 0.005f, 0.005f);	//设置体素大小
	vg.filter(*cloud_filtered);				//执行滤波,保存滤波结果于cloud_filtered
	//==============================================================================

	//--------------------------------- 保存下采样点云 ------------------------------
	if (!cloud_filtered->empty())
	{
		pcl::io::savePCDFileBinary("vg.pcd", *cloud_filtered);
		cout << "->下采样点云的点数为:" << cloud_filtered->points.size() << endl;
	}
	else
	{
		PCL_ERROR("\\a->下采样点云为空!\\n");
		system("pause");
		return -1;
	}
	//==============================================================================

	return 0;
}

输出结果:

->加载了 35947 个数据点
->下采样点云的点数为:3017

3 结果展示


相关链接

PCL点云数据处理基础❤️❤️❤️目录

以上是关于PCL:VoxelGrid ❤️ 点云体素下采样的主要内容,如果未能解决你的问题,请参考以下文章

【PCL】VoxelGrid体素化网格滤波器

VoxelGrid体素滤波器对点云进行下采样

点云处理技术之PCL滤波器——体素滤波器(pcl::VoxelGrid)

PCL:ApproximateVoxelGrid❤️近似体素重心下采样

PCL:UniformSampling ❤️ 点云均匀下采样

PCL:八叉树(Octree)实现点云体素内近邻搜索