pcl读取各类型点云并显示C++

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

pcl读取各类型点云(C++),包括:pcd、ply、txt,后续遇到新类型继续补充

一、pcl读取pcd文件

#define BOOST_TYPEOF_EMULATION
#include <vtkAutoInit.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>

int main()
{
	std::string filename = "../.pcd";
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	if (pcl::io::loadPCDFile<pcl::PointXYZ>(filename, *cloud) == -1)
	{
		std::cout << "error to read point cloud" << std::endl;
		return -1;
	}
	
	/****显示点云****/
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("ShowCloud"));
	viewer->setBackgroundColor(0, 0, 0);

	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 255, 255, 255);
	viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "cloud");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cloud");

	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}

	return 0;
}



二、pcl读取ply文件

#define BOOST_TYPEOF_EMULATION
#include <vtkAutoInit.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>

int main()
{
	std::string filename = "../.ply";
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	if (pcl::io::loadPLYFile<pcl::PointXYZ>(filename, *cloud) == -1)
	{
		std::cout << "error to read point cloud" << std::endl;
		return -1;
	}
	
	/****显示点云****/
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("ShowCloud"));
	viewer->setBackgroundColor(0, 0, 0);

	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 255, 255, 255);
	viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "cloud");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cloud");

	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}

	return 0;
}

三、pcl读取txt文件

#define BOOST_TYPEOF_EMULATION
#include <vtkAutoInit.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>

void creat_pointcloud_from_txt(const std::string& file_path, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud);

int mian()
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	std::string filename = "../.txt";
	creat_pointcloud_from_txt(filename, cloud);
	
	if (cloud->size() == 0)
	{
		std::cout << "error to read point cloud" << std::endl;
		return -1;
	}

	/****显示点云****/
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("ShowCloud"));
	viewer->setBackgroundColor(0, 0, 0);

	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 255, 255, 255);
	viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "cloud");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cloud");

	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}

	return 0;
}

/** 从txt文件中读取点云数据,这里只有X,Y,Z三坐标 **/
void creat_pointcloud_from_txt(const std::string& file_path, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
	std::ifstream file(file_path.c_str());  // 打开文件,.c_str将“file_path”转换为c风格字符串
	std::string line;   // 用于临时存储txt文件中的每一行数据。
	pcl::PointXYZ point;    // 用于读取txt文件中的点坐标
	if (file.is_open()) // 判断文件是否被打开
	{
		while (getline(file, line))  // 读取txt文件中的一行,默认遇到“/n”停止
		{
			std::stringstream ss(line); // 将这一行的字符串转换s为输入流,以便提取数据
			ss >> point.x;
			ss >> point.y;
			ss >> point.z;
			cloud->push_back(point);    // 将读取的数据添加进cloud中
		}
		file.close();   // 关闭文件流
	}
	else    // 错误处理
	{
		std::cout << " 无法打开文件 " << std::endl;
	}
}


读取显示多个点云数据,你可以使用 PCL 库提供的 PCLVisualizer 类,该类可以帮助你创建一个可视化窗口,用于显示多个点云数据。 以下是一个简单的示例代码,可以读取多个点云数据,并在一个窗口中显示它们: ```cpp #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/visualization/pcl_visualizer.h> int main(int argc, char** argv) { // 创建可视化窗口 pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("PointCloud Viewer")); // 读取点云数据 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>("cloud1.pcd", *cloud1); pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>("cloud2.pcd", *cloud2); // 设置可视化窗口的背景颜色和坐标轴 viewer->setBackgroundColor(0, 0, 0); viewer->addCoordinateSystem(1.0); // 添加点云数据到可视化窗口中 viewer->addPointCloud<pcl::PointXYZ>(cloud1, "cloud1"); viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cloud1"); viewer->addPointCloud<pcl::PointXYZ>(cloud2, "cloud2"); viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cloud2"); // 显示点云数据 while (!viewer->wasStopped()) { viewer->spinOnce(100); } return 0; } ``` 在上述代码中,我们首先创建了一个 `PCLVisualizer` 对象作为可视化窗口,并使用 `loadPCDFile` 函数读取了两个点云文件。然后,我们设置了可视化窗口的背景颜色和坐标轴,并将点云数据添加到窗口中。最后,我们使用 `spinOnce` 函数不断更新窗口,直到用户关闭窗口为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值