PCL學習筆記(五):PCD檔案的IO操作
阿新 • • 發佈:2022-03-05
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(newpcl::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