代码参考:
https://blog.csdn.net/xs1997/article/details/78008353
运行环境:VS2013,PCL1.8.0
在网上查找利用PCL库对txt格式的点云文件转换到pcd格式的代码中,只有对XYZ坐标信息的转换,没有对于RGB信息转换的相关代码,于是本文在这里对带有XYZ坐标信息以及RGB颜色信息的txt点云文件到pcd格式的转换进行实现。
首先,本文txt格式的信息格式如下所示,第一列是X坐标,第二列是Y坐标,第三列是Z坐标,第四列是R通道值,第五列是G通道值,第六列是B通道值。RGB取值范围(0~255)。每列数据之间用一个空格隔开。
0.93773 0.33763 0.2247 55 56 57
0.90805 0.35641 0.2268 57 62 58
0.81915 0.32 0.2365 53 57 54
0.97192 0.278 0.2487 44 46 45
0.944 0.29474 0.3258 42 44 43
0.98111 0.24247 0.3658 41 43 42
格式转换代码
#include "stdafx.h"
#include <pcl/io/pcd_io.h>
#include<iostream>
using namespace std;
int numofPoints(char* fname){
int n=0;
int c=0;
FILE *fp;
fp = fopen(fname,"r");
do{
c = fgetc(fp);
if(c == '\n'){
++n;
}
}
while(c != EOF);
fclose(fp);
return n;
}
int main()
{
int n = 0; //n用来计文件中点个数
FILE *fp_1;
fp_1 = fopen("cat.txt","r");
n = numofPoints("cat.txt");//使用numofPoints函数计算文件中点个数
std::cout << "there are "<<n<<" points in the file..." <<std::endl;
//新建一个点云文件,然后将结构中获取的xyz值传递到点云指针cloud中。
pcl::PointCloud<pcl::PointXYZ> cloud;
cloud.width = n;
cloud.height = 1;
cloud.is_dense = false;
cloud.points.resize (cloud.width * cloud.height);
//将点云读入并赋给新建点云指针的xyz
double x,y,z;
double r,g,b;
int i = 0;
while(6 ==fscanf(fp_1,"%lf %lf %lf %lf %lf %lf\n",&x,&y,&z,&r,&g,&b)){
cloud.points[i].x = x;
cloud.points[i].y = y;
cloud.points[i].z = z;
cloud.points[i].r = r;
cloud.points[i].g = g;
cloud.points[i].b = b;
cloud.points[i].a = 1;%没弄清楚为什么a要设为1
++i;
}
cout<<i<<" points has been saved."<<endl;
fclose(fp_1);
//将点云指针指向的内容传给pcd文件
pcl::io::savePCDFileASCII ("point3d.pcd", cloud);
std::cerr <<"Saved " << cloud.points.size () <<" data points to point3d.pcd." << std::endl;
system("pause");
return 0;
}
最后,如果哪位大佬知道代码44行中的cloud.points[i].a 为什么要赋值为1,请告诉我,感谢。。。