您的位置:首页 > 其它

点云txt格式转pcd格式

2016-06-18 07:48 246 查看
之前整理过一个版本,但是使用了结构体,前前后后略显复杂,并且在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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: