PCL学习笔记——数据输入与输出

PCL学习笔记——数据输入与输出

1.从PCD文件中读取与保存点云文件

pcl::io::loadPCDFile
#include <iostream> //标准C++库输入输出相关头文件
#include <pcl/io/pcl_io.h> //pcd读写相关头文件
#include <pcl/point_types.h> //pcl中支持的点类型头文件

//点云格式的宏定义,即使用PointT代替pcl::PointXYZ
typedef pcl::PointXYZ PointT;
int main(int argc, char** argv)
{
    
    
	//定义点云指针
	pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
	//pcl::io::loadPCDFile<PointT>函数导入pcd文件,并将点云存储在cloud中,如果未读取到则为-1
	if(pcl::io::loadPCDFile<PointT>("abc.pcd", *cloud) == -1)
	{
    
    
		PCL_ERROR("couldn't read file\n");//PCL_ERROR是pcl中输出错误信息的函数
		return(-1);
	}
	std::cout<<"点云大小"<<cloud->size()<<std::endl;
	//pcl::io::savePCDFile函数将cloud点云存储在save.pcd文件中
	pcl::io::savePCDFile("save.pcd",*cloud);

	sysrem("pause");
	return(0);
pcl::PCDReader reader
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>

int
main (int argc, char** argv)
{
    
    
  pcl::PCLPointCloud2::Ptr cloud (new pcl::PCLPointCloud2 ());
  pcl::PCLPointCloud2::Ptr cloud_filtered (new pcl::PCLPointCloud2 ());

  // 从文件读取点云图
  // Fill in the cloud data
  pcl::PCDReader reader;
  // Replace the path below with the path where you saved your file
  reader.read ("./data/table_scene_lms400.pcd", *cloud); // Remember to download the file first!

  std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height 
       << " data points (" << pcl::getFieldsList (*cloud) << ").";

  // 创建一个长宽高分别是1cm的体素过滤器,cloud作为输入数据,cloud_filtered作为输出数据
  float leftSize = 0.01f;
  // Create the filtering object
  pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
  sor.setInputCloud (cloud);
  sor.setLeafSize (leftSize, leftSize, leftSize);
  sor.filter (*cloud_filtered);

  std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height 
       << " data points (" << pcl::getFieldsList (*cloud_filtered) << ").";

  // 将结果输出到文件
  pcl::PCDWriter writer;
  writer.write ("./data/table_scene_lms400_downsampled.pcd", *cloud_filtered);

  return (0);
}

2.读取与保存PLY文件

后缀命名为.ply格式文件,常用的点云数据文件。ply文件不仅可以存储点数据,而且可以存储网格数据. 用编辑器打开一个ply文件,观察表头,如果表头element face的值为0,则表示该文件为点云文件,如果element face的值为某一正整数N,则表示该文件为网格文件,且包含N个网格.所以利用pcl读取 ply 文件,不能一味用pcl::PointCloud::Ptr cloud (new pcl::PointCloud)来读取。在读取ply文件时候,首先要分清该文件是点云还是网格类文件。如果是点云文件,则按照一般的点云类去读取即可,如果ply文件是网格类,则需要:
在这里插入图片描述
#include <pcl/io/ply_io.h> //引入ply文件读取的头文件

pcl::PolygonMesh mesh; //定义用于存储ply网格文件的变量
pcl::io::loadPLYFile("readName.ply", mesh); //读取ply网格文件
pcl::io::savePLYFile("saveName.ply", mesh); //保存ply网格文件

显示ply网格完整代码示例:

#include <pcl/common/io.h>
#include <pcl/io/io.h>
#include <pcl/point_cloud.h>
#include <pcl/io/ply_io.h>
#include <pcl/io/ply/ply.h>
#include <pcl/console/parse.h>
#include <iostream>
#include <string>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/PolygonMesh.h>
#include <pcl/io/ply_io.h>
#include <pcl/io/vtk_lib_io.h>
//#include <pcl/io/vtk_lib_io.hpp>
#include <pcl/io/vtk_io.h>

#include <stdlib.h>
using namespace pcl;
using namespace pcl::io;
using namespace pcl::console;


using namespace std;

int
main(int argc, char** argv)
{
//pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	PolygonMesh cloud;
//boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
	pcl::visualization::PCLVisualizer viewer("PCL PolygonMesh");

	string filename = "Output_.ply";
	pcl::io::loadPolygonFilePLY(filename, cloud);

	viewer.addPolygonMesh(cloud);
	viewer.setBackgroundColor(0.2, 0.0, 0.0);
	while (!viewer.wasStopped())
	{
		viewer.spinOnce();
	}


	return 0;
}

读取PLY点云文件示例:

int readcloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, string filename) {
	// PointXYZ表示三维坐标信息 
	// 读取ply文件
	if (pcl::io::loadPLYFile<pcl::PointXYZ>(filename, *cloud) == -1) {
		//PCL_ERROR("Couldnot read file.\n");
		cout << "Couldnot read file." << endl;
		system("pause");
		return -1;
	}
	cout << "已读取并显示"<<filename<<"原始点云数据" << endl;
	cout << filename<<"原始点云数据点数:" << cloud->points.size() << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_45388819/article/details/109964933