PCL入门第三节2020.02.19

PCL文件的IO操作

读取文件

#include <iostream>
#include <pcl/io/pcd_io.h> //PCD读写类的相关文件
#include <pcl/point_types.h> //PCL中支持的点类型头文件
int
main(int argc,char**argv)
{
 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); //创建一个PointCloud<PointXYZ> boost共享指针并进行实例化
 if(pcl::io::loadPCDFile<pcl::PointXYZ>("test_pcd.pcd",*cloud)== -1)//用二进制进行读取 ,打开点云文件
 {
   PCL_ERROR("Couldn`t read file test_pcd.pcd\n");
   return(-1);
 }
 //sensor_msgs::PointCloud2cloud_blob;//PoointCloud2适合版本低的点云文件
 //pcl::io::loadPCDFile("test_pcd.pcd,cloud_blob");
 //pcl::fromROSMsg(cloud_blob,*cloud);
 //*sensor_msgs/PointCloud2转化为pcl::PointCloud<T>
 //把二进制块读取并转化到模板化的PointCloud格式里,这里用pcl::PointXYZ作为点类型
 for(size_t=0;i<cloud->points.size();++i)
 {
   std::cout<<"  "<<cloud->points[i].x<<"  "<<cloud->points[i].y<<"  "<<cloud->points[i].z<<std::endl;
 }
//打印文件数据
return 0;
}

写入文件

#include <iostream>
#include <pcl/io/pcd_io.h> //PCD读写类的相关文件
#include <pcl/point_types.h> //PCL中支持的点类型头文件
int
main(int argc,char**argv)
{
   pcl::PointCloud<pcl::PointXYZ> cloud;
   cloud.width = 5;
   cloud.height = 1;
   cloud.is_dense = false;
   cloud.points.resize(cloud.width*cloud.height);
   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);
 }
 pcl::io::savePCDFileASCII("test_pcd.pcd", cloud);
 std::cerr << "Finish" << std::endl;
 system("pause");
}

拼接文件

#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 specify 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.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)
{
cloud_b.width=3;
cloud_b.points.resize(cloud_b.width*cloud_b.height);
}
else{
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)
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
for(size_t i=0;i<n_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);
}
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;
if(strcmp(argv[1],"-p")==0)
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;
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_c=cloud_a;
cloud_c+=cloud_b;//上下拼接见图1
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
{
pcl::concatenateFields(cloud_a,n_cloud_b,p_n_cloud_c);//左右拼接见图2
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);
}

图2图1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值