点云txt格式转pcd格式

10 篇文章 0 订阅
7 篇文章 0 订阅

之前整理过一个版本,但是使用了结构体,前前后后略显复杂,并且在xcode中运行的时候,面对较大文件特别容易出现内存分配错误,以下内容进行了精简和简化,在配置安装了pcl点云库的project下,可以直接饮用以下代码。


//计算txt点中的个数的方法实现

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;

}


//以下是将txt中点云转成pcd的fuction

void txt2pcd(){  

    

    int n = 0; //n用来计文件中点个数    

    

    FILE *fp_1;

    fp_1 = fopen("tree_01.txt","r");

    n = numofPoints("yulan_tree_01.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;

    int i = 0;

    while(3 ==fscanf(fp_1,"%lf,%lf,%lf\n",&x,&y,&z)){

        cout<<x<<" "<<y<<" "<<z<<endl;

        cloud.points[i].x = x;

        cloud.points[i].y = y;

        cloud.points[i].z = z;

        ++i;

    }

    fclose(fp_1);

    

    //将点云指针指向的内容传给pcd文件

    pcl::io::savePCDFileASCII ("yulan_tree_01.pcd", cloud);

    std::cerr <<"Saved " << cloud.points.size () <<" data points to test_pcd.pcd." << std::endl;

    

}


*********************************************************************************************************

*********************************************************************************************************

fscanf函数的格式化输出当中,对应的格式化输出类型极容易出现问题,在xcode当中注意下面的问题。    

    FILE *fp_2 = fopen("data.txt","r");

    if(fp_2){

        char a[10]; //取字符串需要定义为一个字符数组,若定义为string类型变量或者是定义一个字符数组都容易出内存问题

        int d = 0;

        fscanf(fp_2, "%s %d\n",a,&d);


        cout<<a<<d<<endl;

        }

    fclose(fp_2);


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值