概述
pcd文件格式是点云的一种常用存储格式,而有的时候我们可能需要需要将pcd的点云格式转换成其他格式,例如csv,txt或者ply等,这里可以用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