PCL点云可视化及滤波处理

看PCL已经有一段时间了,慢慢有了一点感悟和积累,想把自己的学习经历记录下来。

下面这一段程序是用来进行点云可视化和使用VoxelGrid滤波器对点云进行下采样处理的:

<span style="font-family:Microsoft YaHei;font-size:14px;">#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/visualization/cloud_viewer.h>

std::stringstream ss;
std::string FileLocation;//存储位置
std::string FileName;    //文件名称

void viewerOneOff (pcl::visualization::PCLVisualizer& viewer)
{
    viewer.setBackgroundColor(0,0,0);//设置窗口背景颜色(这里是黑色)
}
    
int main (int argc, char** argv)
{
	/***************可视化将要处理的PCD点云文件****************/
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
	pcl::io::loadPCDFile (argv[1], *cloud);
	pcl::visualization::CloudViewer viewer("点云滤波之前"); 
    viewer.showCloud(cloud);
	viewer.runOnVisualizationThreadOnce (viewerOneOff);
	/*********************************************************/
	std::cout << std::endl;

	char key = 0;
	std::cout << "是否使用VoxelGrid滤波器对点云进行下采样(Y/N):";
	std::cin >> key;

	if( (key=='Y')||(key=='y') )
	{
		/******************对当前显示的点云使用VoxelGrid滤波器进行下采样******************/
		std::cout << "请输入将点云文件滤波后要保存的地址(例如 C:/PCD_FILTER):" << std::endl;
		std::cin >> FileLocation;
		std::cout << "请输入新的文件名(例如 xxx.pcd):" << std::endl;
		std::cin >> FileName;
		std::cout << "正在处理,请稍等..." << std::endl;

		ss << FileLocation << '/' << FileName;

		sensor_msgs::PointCloud2::Ptr cloud (new sensor_msgs::PointCloud2 ());
		sensor_msgs::PointCloud2::Ptr cloud_filtered (new sensor_msgs::PointCloud2 ());

		pcl::PCDReader reader;

		reader.read (argv[1], *cloud);
		pcl::VoxelGrid<sensor_msgs::PointCloud2> sor;
		sor.setInputCloud (cloud);
		sor.setLeafSize (0.01f, 0.01f, 0.01f);
		sor.filter (*cloud_filtered);
		pcl::PCDWriter writer;
		writer.write (ss.str(), *cloud_filtered, Eigen::Vector4f::Zero (), Eigen::Quaternionf::Identity (), false);

		std::cout << "OK!处理完成!关闭当前点云显示窗口后会显示滤波后的点云" << std::endl;
		/********************************************************************************/
	}

	while(!viewer.wasStopped());//判断是否关闭了滤波之前的点云显示窗口,如果没关闭就继续等待

	if(viewer.wasStopped())//如果关闭了窗口则重新显示滤波之后的点云
	{
		pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
		pcl::io::loadPCDFile (ss.str(), *cloud);
		pcl::visualization::CloudViewer viewer("点云滤波之后"); 
		viewer.showCloud(cloud);
		viewer.runOnVisualizationThreadOnce (viewerOneOff);
                std::cout << "滤波前的窗口已关闭,当前窗口为滤波后的点云" << std::endl;
                while(!viewer.wasStopped());
	}
    return 0;
}
</span>
PCL点云可视化及滤波处理_第1张图片

PCL点云可视化及滤波处理_第2张图片

PCL点云可视化及滤波处理_第3张图片

你可能感兴趣的:(filter,kinect,openni,Visualization,PCL)