体素采样(基于PCL)

体素采样(基于PCL)

一、原理介绍

点云体素采样是通过输入的点云数据创建一个三维体素栅格(可把体素栅格想象为微小的空间三维立方体的集合),然后在每个体素(即,三维立方体)内,用体素中所有点的重心来近似显示体素中其他点,这样该体素就内所有点就用一个重心点最终表示,对于所有体素处理后得到过滤后的点云。这种方法比用体素中心来逼近的方法更慢,但它对于采样点对应曲面的表示更为准确。

一、C++代码

#include 
#include 

//功能介绍:读入txt、asc->pcl::PointNormal格式
void createCloudFromTxt(const std::string& file_path, pcl::PointCloud::Ptr cloud)
{
	std::ifstream file(file_path.c_str());//c_str():生成一个const char*指针,指向以空字符终止的数组。
	std::string line;
	pcl::PointNormal point;
	while (getline(file, line))           //用到x,y,z
	{
		std::stringstream ss(line);
		ss >> point.x;
		ss >> point.y;
		ss >> point.z;
		ss >> point.normal_x;
		ss >> point.normal_y;
		ss >> point.normal_z;

		cloud->push_back(point);
	}
	file.close();
}

void VoxelGridFilter(pcl::PointCloud::Ptr cloud, pcl::PointCloud::Ptr filteredCloud)
{

	//统计滤波前的点云个数
	std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height << " data points." << std::endl;

	// 创建体素栅格下采样: 下采样的大小为1cm
	pcl::VoxelGrid sor;  //体素栅格下采样对象
	sor.setInputCloud(cloud);             //原始点云
	sor.setLeafSize(60, 60, 60);    // 设置采样体素大小
	sor.filter(*filteredCloud);        //保存


	// 保存下采样后的点云
	pcl::PCDWriter writer;
	writer.write("tube1_new75_voxelgrid.pcd", *filteredCloud, false);
}


int main(int argc, char** argv)
{
	pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
	pcl::PointCloud::Ptr filteredCloud(new pcl::PointCloud);
	createCloudFromTxt("tube1_new75.asc", cloud);
	VoxelGridFilter(cloud, filteredCloud);
}

二、效果图

体素采样(基于PCL)_第1张图片
体素采样(基于PCL)_第2张图片

你可能感兴趣的:(三维点云学习过程,c++)