PCL库学习(1)----带颜色纹理的点云格式转换(txt格式转换为pcd格式)


代码参考:

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,请告诉我,感谢。。。

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值