1. 程式人生 > 其它 >PCL學習筆記(五):PCD檔案的IO操作

PCL學習筆記(五):PCD檔案的IO操作

1、PCD檔案讀取點雲資料

#include<iostream>

#include<pcl/io/pcd_io.h>
#include<pcl/point_types.h>

int 
main(int argc,char **argv)
{
    //宣告點雲物件指標(點雲型別為XYZ點雲結構),並初始化該物件,pointcloud是一個泛型類,所以每次使用的記得申明
    //這一句程式碼的作用是建立一個真是引數為PointXYZ的PointCloud型別的boost共享指標並初始化
    pcl::PiontCloud<pcl::PointXYZ>::Ptr cloud(new
pcl::PointCloud<pcl::PointXYZ>); int flatMeathod = 1; if(flatMeathod ==0 ) { printf("採用pcl::io::loadPCDFile<pcl::PointXYZ>的方式讀取\n"); //開啟本地的點雲檔案test_pcd.pcd //PointCloud類中解析了pcd檔案的各欄位 //判斷檔案是否存在 if(pcl::io::loadPCDFile<pcl::PointXYZ>("
/home/zll/source/test_pcd.pcd",*cloud)== -1) { PCL_ERROR("could not find test_pcd.pcd"); return -1; } } else { printf("採用pcl::PCLPointCloud2 的方式讀取"); //整理需要先轉換為PCLPointCloud2型別 pcl::PCLPointCloud2 cloud2; pcl::io::loadPCDFile(
"/home/zll/source/test_pcd.pcd",cloud2); if(pcl::io::loadPCDFile("",cloud2)==-1) { return -1; } else{ pcl::fromPCLPointCloud2(cloud2,*cloud); } } for(size_t i=0;i<cloud->points.size();i++) { std::cout<<""<<cloud->points[i].x<<""<<cloud->points[i].y<<cloud->points[i].z<<std::endl; } return 0; }

2、向PCD檔案寫入點雲資料

#include<iostream>
#include<pcl/io/pcd_io.h>
#include<pcl/point_types.h>

int 
main(int argc,char ** argv)
{
    //例項化模板類PointCloud,每個點都被設定為pcl::PointXYZ,作為模板類例項化的引數
    pcl::PointCloud<pcl::PointXYZ>cloud;
    //建立點雲
    cloud.width=5;
    cloud.height=1;
    cloud.is_dense=false;
    //Point欄位=寬*高 
    cloud.points.resize(cloud.width*cloud.height);
    //用隨機的值填充PointCloud點雲物件
    for(size_t i=0;i<cloud.points.size();++i)
    {
        cloud.points[i].x=1024*rand()/(RAND_MAX+1.0f);
        cloud.points[i].y=1024*rand()/(RAND_MAX+1.0f);
        cloud.points[i].z=1024*rand()/(RAND_MAX+1.0f);
    }
    //把PointCloud物件資料儲存在test_pcd.pcd檔案中
    pcl::io::savePCDFileASCII("test_pcd.pcd",cloud);
    //列印輸出儲存的點雲資料
    std::cerr<<"Saved"<<cloud.points.size()<<"data points to test_pcd.pcd"<<std::endl;
    for(size_t i=0;i<cloud.points.size();++i)
    {
        std::cerr<<" "<<could.poitns[i].x<<cloud.points[i].y<<" "<<cloud.points[i].z<<std::endl;
    }
    return (0);
}

3、兩個點雲中的欄位或資料連線

進行操作前要確保兩個資料集中欄位的型別相同和維度相等

#include<iostream>
#include<pcl/io/pcd_io.h>
#include<pcl/point_types.h>

int 
main(int argc,char **argv)
{
    if(argc!=2)
    {
        std::cerr<<"please specifty Command line arg '-f' or '-p' "<<std::endl; 
        exit(0);
    }
    pcl::PointCloud<pcl::PointXYZ>cloud_a,cloud_b,cloud_c;
    pcl::PointCloud<pcl::Normal>n_cloud_b;
    pcl::PointCloud<pcl::PointNormal>p_n_cloud_c;

    //三個輸入(cloud_a,cloud_b和n_cloud_b),兩個輸出(cloud_c和p_n_cloud_c)
    Cloud_a.width=5;
    Cloud_a.height=cloud_b.height=n_cloud_b.height=1;
    Cloud_a.points.resize(cloud_a.width*cloud_a.height);
    if(strcmp(argv[1],"-p")==0)//判斷是否為連線a+b=c
    {
        cloud_b.width=3;
        cloud_b.points.resize(n_cloud_b.width*n_cloud_b.height);
    }
    else{//如果是連線xyz與normal,則生成5個法線
        n_cloud_b.width=5;
        n_cloud_b.points.resize(n_cloud_b.width*n_cloud_b.height);
    }
    //迴圈生成無序點雲,填充上面定義的兩種型別點雲物件
    for(size_t i=0;i<cloud_a.points.size();++i)
    {
        cloud_a.points[i].x=1024*rand()/(RAND_MAX+1.0f);
        cloud_a.points[i].y=1024*rand()/(RAND_MAX+1.0f);
        cloud_a.points[i].z=1024*rand()/(RAND_MAX+1.0f);
    }
    if(strcmp(argv[1],"-p")==0)
    {
        //如果連線a+b=c,則cloud_b用兩個點作為xyz資料
        for(size_t i=0;i<cloud_b.points.size();++i)
    {
        cloud_b.points[i].x=1024*rand()/(RAND_MAX+1.0f);
        cloud_b.points[i].y=1024*rand()/(RAND_MAX+1.0f);
        cloud_b.points[i].z=1024*rand()/(RAND_MAX+1.0f);
    }

    }
    else
    {
        //如果連線xyz+normal=xyznormal,則n_cloud_b用5個點作為normal資料
        for(size_t i=0;i<cloud_b.points.size();++i)
        {
            n_cloud_b.points[i].normal[0]=1024*rand()/(RAND_MAX+1.0f);
            n_cloud_b.points[i].normal[1]=1024*rand()/(RAND_MAX+1.0f);
            n_cloud_b.points[i].normal[2]=1024*rand()/(RAND_MAX+1.0f);
        }
    }
    //將cloud_a和cloud_b或n_cloud_b的資料輸出
    std::cerr<<"Cloud A:"<<std::endl;
    for(size_t i=0;i<cloud_a.points.size();++i)
    {
        std::cerr<<" "<<cloud_a.points[i].x<<" "<<cloud_a.points[i].y<<" "<<cloud_a.points[i].z<<std::endl;
    }
    std::cerr<<"Cloud B:"<<std::endl;
    for(size_t i=0;i<cloud_b.points.size();++i)
    {
        std::cerr<<" "<<cloud_b.points[i].x<<" "<<cloud_b.points[i].y<<" "<<cloud_b.points[i].z<<std::endl;
    }
    if(strcmp(argv[1],"-p")==0)
    {
        for(size_t i=0;i<cloud_b.points.size();++i)
        {
            std::cerr<<" "<<cloud_b.points[i]<<" "<<cloud_b.points[i]<<" "<<cloud_b.points[i]<<std::endl;
        }
    }
    else
    {
        for(size_t i=0;i<n_cloud_b.points.size();++i)
        {
            std::cerr<<" "<<n_cloud_b.points[i].normal[0]<<" "<<n_cloud_b.points[i].normal[1]<<" "<<n_cloud_b.points[i].normal[2]<<std::endl;
        }
    }

    if(strcmp(argv[1],"-p")==0)
    {
        //把cloud_a和cloud_b連線在一起建立了cloud_c
        cloud_c=cloud_a;
        cloud_c+=cloud_b;
        std::cerr<<"Cloud C: "<<std::endl;
        //輸出
        for(size_t i=0;i<cloud_c.points.size();++i)
        {
            std::cerr<<" "<<cloud_c.points[i].x<<" "<<cloud_c.points[i].y<<" "<<cloud_c.points[i].z<<std::endl;
        }
    }
    else
    {
        //把cloud_a和n_cloud_b欄位連線在一起建立p_n_cloud_c
        pcl::concatenateFields(cloud_a,n_cloud_b,cloud_b,p_n_cloud_c);
        std::cerr<<"Cloud C: "<<std::endl;
        //輸出
        for(size_t i=0;i<p_n_cloud_c.points.size();++i)
        {
            std::cerr<< " "<<p_n_cloud_c.points[i].x<<" "<<p_n_cloud_c.points[i].y<<" "<<p_n_cloud_c.points[i].z<<" "
            <<p_n_cloud_c.points[i].normal[0]<<" "<<p_n_cloud_c.points[i].normal[1]<<" "<<p_n_cloud_c.points[i].normal[2]<<std::endl;

        }
    }
    return (0);
}

參考:

https://www.cnblogs.com/codeAndlearn/p/11609364.html