【记录】PCL 滤波 Downsampling a PointCloud using a VoxelGrid filter 体素滤波

官网在这里:http://pointclouds.org/documentation/tutorials/voxel_grid.php#voxelgrid

// 官网教程:http://pointclouds.org/documentation/tutorials/voxel_grid.php#voxelgrid
// 在官网教程基础上增加点云可视化部分代码,实例pcd文件为XYZI格式,可视化颜色根据pcd文件"intensity"属性生成
// 增加计时部分代码,使用PCL自带的计时函数计时

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/common/time.h> // 计时
// 可视化相关头文件都一起堆在这儿
#include <thread>
#include <pcl/common/common_headers.h>
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/parse.h>

int
main(int argc, char** argv)
{
	pcl::StopWatch time; // 计时开始

	// pcl::PCLPointCloud2::Ptr cloud(new pcl::PCLPointCloud2());
	// pcl::PCLPointCloud2::Ptr cloud_filtered(new pcl::PCLPointCloud2());
	pcl::PointCloud<pcl::PointXYZI>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZI>);
	pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZI>);

	// Fill in the cloud data
	pcl::PCDReader reader;
	// Replace the path below with the path where you saved your file
	reader.read("E:/Visual Studio 2017/Filters/2 voxel_grid/source/table_scene_lms400.pcd", *cloud); // Remember to download the file first!
	std::stringstream str1;
	/*std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height
		<< " data points (" << pcl::getFieldsList(*cloud) << ").";
		*/
	str1 << "PointCloud before filtering: " << cloud->width * cloud->height
		<< " data points (" << pcl::getFieldsList(*cloud) << ").";

	// Create the filtering object
	// 创建一个大小为1cm的pcl::VoxelGrid滤波器
	// pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
	pcl::VoxelGrid<pcl::PointXYZI> sor;
	sor.setInputCloud(cloud); // 给滤波对象设置需要过滤的点云
	sor.setLeafSize(0.01f, 0.01f, 0.01f); // 设置滤波时创建的体素大小为1cm立方体
	// sor.setLeafSize(0.05f, 0.05f, 0.05f);
	sor.filter(*cloud_filtered); // 执行滤波处理,存储输出cloud_filtered
	std::stringstream str2;
	/*std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height
		<< " data points (" << pcl::getFieldsList(*cloud_filtered) << ").";
		*/
	str2 << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height
		<< " data points (" << pcl::getFieldsList(*cloud_filtered) << ").";
	pcl::PCDWriter writer;
	writer.write("table_scene_lms400_downsampled.pcd", *cloud_filtered);
	// writer.write("table_scene_lms400_downsampled.pcd", *cloud_filtered, Eigen::Vector4f::Zero(), Eigen::Quaternionf::Identity(), false);

	std::cout << "运行时间:" << time.getTime() << "ms(毫秒)" << std::endl;
	std::cout << "运行时间:" << time.getTimeSeconds() << "s(秒)" << std::endl;

	// 可视化
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("voxel_grid 3D Viewer"));
	viewer->initCameraParameters(); // 通过设置照相机参数使得从默认的角度和方向观察点云

	int v1(0);  //创建新的视口
	viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1); // 4个参数分别是X轴的最小值,最大值,Y轴的最小值,最大值,取值0-1,v1是标识
	viewer->setBackgroundColor(0, 0, 0, v1); // 设置视窗的背景颜色
	// viewer->addText("cloud before voxelgrid filtering", 10, 10, "v1 text", v1); // 添加一个标签区别其他窗口
	viewer->addText(str1.str(), 10, 10, "v1 text", v1); // 添加一个标签区别其他窗口
	pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZI>cloud_color(cloud, "intensity");
	viewer->addPointCloud<pcl::PointXYZI>(cloud,cloud_color,"cloud",v1);

	// 对第二视口做同样的操作,使得做创建的点云分布于右半窗口,将该视口背景赋值于灰色,以便明显区别,虽然添加同样的点云,给点云自定义颜色着色
	int v2(0);
	viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);
	viewer->setBackgroundColor(0.3, 0.3, 0.3, v2); 
	// viewer->addText("cloud after voxelgrid filtering", 10, 10, "v2 text", v2);
	viewer->addText(str2.str(), 10, 10, "v2 text", v2);
	pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZI>cloud_filtered_color(cloud_filtered, "intensity");
	viewer->addPointCloud<pcl::PointXYZI>(cloud_filtered, cloud_filtered_color,"cloud_filtered", v2);
	// 为所有视口设置属性
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "cloud");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "cloud_filtered");
	//  改变显示点云的尺寸
	viewer->addCoordinateSystem(1.0); // 从默认的角度和方向观察点云

	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);
		boost::this_thread::sleep (boost::posix_time::microseconds(10000));
	} // 每次调用spinOnce都给视窗处理事件的时间,允许鼠标、键盘等交互操作

	getchar(); // 防止闪退
	return (0);
}

setLeafSize(0.01f, 0.01f, 0.01f)

前460400;后41049

setLeafSize(0.05f, 0.05f, 0.05f)

前460400;后2215


版权声明:本文为weixin_43661854原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。