pcd点云文件格式转csv、txt、ply格式

概述

pcd文件格式是点云的一种常用存储格式,而有的时候我们可能需要需要将pcd的点云格式转换成其他格式,这里可以用pcl库对点云格式进行转换。
开发工具:VS2017
需要提前配置:PCL1.9.0
PCL1.9.0库的百度网盘链接:
链接:https://pan.baidu.com/s/19-TutTnfrxAjgSkHSqby_A
百度网盘-PCL1.9.0
提取码:on37

这里有关于VS2017配置PCL1.9.0库的教程可以参考另一位博主写的博客,他写的非常详细:
https://blog.csdn.net/weixin_41991128/article/details/83864713
CSDN VS2017配置PCL

pcd转csv

csv格式的文件是以 (,)作为分隔符,这里将pcd格式的点云转换为csv格式。其中csv文件的点云数据只包含了点云的空间信息(XYZ)及颜色信息(RGB),而不包含pcd文件的文件头信息。在csv文件中,每一行数据包含了点云中的一个点的六种信息,不同信息之间以(,)进行分割。详细代码如下所示:


#include <iostream>
#include <pcl/io/pcd_io.h>  
#include <pcl/point_types.h>  
#include <cstring>
#include <string.h>
#include <stdio.h>

using namespace std;

void Pcd2Csv(string in,string out);                           //将pcd点云转换为csv格式

int main(int argc, char *argv[])
{
	for (int i = 0;i < 1 ; i++)
	{
		string temName = to_string(i);
		string temInput = "pcd/" + temName + ".pcd";          //获取输入文件名
		string temOutput = "csv/" + temName + ".csv";         //获取输出文件名
		Pcd2Csv(temInput, temOutput);
	}

	return 0;
}


void Pcd2Csv(string inName,string outName)
{
	pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);

	if (pcl::io::loadPCDFile<pcl::PointXYZRGBA>(inName, *cloud) == -1)
	{
		PCL_ERROR("Couldn't read pcd file\n");
		return;
	}

	int Num = cloud->points.size();                           //获取点云总数
	double *X = new double[Num] {0};                          //初始化点云数据数组
	double *Y = new double[Num] {0};
	double *Z = new double[Num] {0};
	double *R = new double[Num] {0};   
	double *G = new double[Num] {0};   
	double *B = new double[Num] {0};   

	for (int i = 0; i < Num; i++ )                            //给点云数据数组赋值
	{
		X[i] = cloud->points[i].x;
		Y[i] = cloud->points[i].y;
		Z[i] = cloud->points[i].z;
		R[i] = cloud->points[i].r;
		G[i] = cloud->points[i].g;
		B[i] = cloud->points[i].b;
	}

	ofstream zos(outName);
	for (int i = 0; i < Num; i++)                             //以csv文件格式(以 , 分割)存储点云数据
	{
		zos << X[i] << "," << Y[i] << "," << Z[i] << "," << R[i] << "," << G[i] << "," << B[i] << endl;
	}
	cout << "   pcd文件转换完成 ! 输入文件:" <<  inName  << " , 输出文件:" << outName << endl;
}

上述代码可以实现多个pcd文件的转换,这里我是将需要转换的pcd文件存放至当前工程下的一个名为pcd的文件夹中,其中pcd文件是以0、1、2、3…的数字进行命名,生成的csv文件则被存放至当前工程下的一个名为csv的文件夹中。
如果原始的pcd文件中不存在颜色信息,则需要将pcd::PointXYZRGBA修改为pcd::PointXYZ,同时后面不再对RGB信息进行操作即可。

pcd转txt

只需要将上诉代码中输出文件的后缀名改成.txt即可。

pcd转ply

ply也是点云的一种常用格式,将pcd文件转换为ply文件格式同样可以使用pcl库,代码实现起来也比较简单。


#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include<pcl/PCLPointCloud2.h>
#include<iostream>
#include<string>

using namespace pcl;
using namespace pcl::io;
using namespace std;

void Pcd2Ply(string & inName, string & outName);      //将pcd文件转化为ply

int main()
{
    string temInput = "pcd/test.pcd";                 //输入文件名
	string temOutput = "ply/test_out.ply";            //输出文件名
	Pcd2Ply(temInput, temOutput);
	return 0;
}

void Pcd2Ply(string & inName, string & outName)
{
	pcl::PCLPointCloud2 cloud;
	if (loadPCDFile(inName, cloud) < 0)               //如果输入文件名字出现错误
	{
		PCL_ERROR("Couldn't read pcd file\n");

		return;
	}
	PLYWriter writer;
	writer.write(outName, cloud, Eigen::Vector4f::Zero(), Eigen::Quaternionf::Identity(), true, true);

	cout << "   pcd文件转换完成 ! 输入文件:" << inName << " , 输出文件:" << outName << endl;
}


上述代码可以实现将点云的pcd文件转换为.ply格式,我们可以通过MeshLab来查看我们生成的点云ply文件。

这里给大家提供一些测试用的点云pcd文件。
链接:https://pan.baidu.com/s/1iHk0rGbrJpD5DBgFjCIMdw
百度网盘-pcd点云数据
提取码:p3au

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页