PCD文件解析

上一节中,我们获取的PCD格式点云文件,内容如下:

# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z
SIZE 4 4 4
TYPE F F F
COUNT 1 1 1
WIDTH 5
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 5
DATA ascii
1.28125 577.09375 197.9375
828.125 599.03125 491.375
358.6875 917.4375 842.5625
764.5 178.28125 879.53125
727.53125 525.84375 311.28125

PCD文由 “头文件 + 点云数据” 构成,头文件声明了该点云数据集的基本特性。

第零行为注释:标明文件类型。

第一行:VERSION

  • 指定PCD文件的版本,由0.7可知该点云数据集是0.7版本的。

第二行:FIELDS

  • 指定本点云数据集中任意一个点可以有的维度信息和其他附加信息。如:FIELDS x y z  指每个点都有xyz三个维度信息,FIELDS x y z rgb 指每个点除了xyz维度信息外还有颜色信息等。

第三行:SIZE

  • 储存每个维度信息占用的字节数(byte)。1指用char型数据存储维度信息,2指用short型数据存储维度信息,4指用int或float型数据存储维度信息,8指用double型数据存储维度信息。

第四行:TYPE

  • 用字符指定每一个维度的数据类型。

    • I表示有符号类型:int8(char),int16(short),int32(int);
    • U表示无符号类型:uint8(unsigned char),uint 16(unsigned short),uint32(unsigned int);
    • F表示浮点型float和double。

第五行:COUNT

  • 每个维度包含的元素个数。

第六行:WIDTH

  • 点云数据集可分为有序数据集无序数据集两种。

    • 有序数据集类似矩阵,有行列之分,无序数据集则无行列之分。
    • 根据数据集是否有序,WIDTH由不同的含义。
      • 对有序数据集而言:表示数据集的宽度(每行点的数目);
      • 对于无序数据集而言:表示数据集中点的总数(和下面的POINTS一样)。

第七行:HEIGHT

  • 对有序数据集而言:表示数据集的高度(行数);
  • 对于无序数据集而言:被设置为1,用于声明一个数据集是否有序

第八行:VIEWPOINTS

  • 数据集中点云的获取视点。视点信息被指定为“平移(txtytz) + 四元数(qwqxqyqz)”,默认值是:VIEWPOINT 0 0 0 1 0 0 0

第九行:POINTS

  • 点云中点的总数,从0.7版本就开始显得有点多余,可能会在后续版本中舍去这个参数。

第十行:DATA

  • 指定存储点云数据的数据存储格式:ASCLL码或二进制数据。

后续是数据部分:

  • 以ASCLL码存储的点云数据,每一个点占据一行,“nan”表示不存在或非法的数据。

PCD文件读取

#include<iostream>
#include<pcl/io/pcd_io.h>
#include<pcl/point_types.h>
using namespace std;int main()
{pcl::PointCloud < pcl::PointXYZ >::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);// 创建点云指针。// 读入PCD格式文件,如果文件不存在,返回-1if (pcl::io::loadPCDFile<pcl::PointXYZ>("test_pcd_file.pcd", *cloud) == -1)   {PCL_ERROR("Couldn't read file test_pcd_file.pcd\n");return -1;}cout << "Loaded "<< cloud->points.size()<< " data points from test_pcd_file.pcd with the following fields:"<< endl;// 显示前5个点:for (size_t i = 0; i < 5; i++){cout << cloud->points[i].x << "\t" << cloud->points[i].y << "\t" << cloud->points[i].z << endl;}system("pause");return 0;
}

xyz文件转pcd文件

  • xyz格式数据一般每行有6列数据前3列分别为点的 x,y,z坐标后3列为点的法向量,一般以空格分隔
#include<iostream>
#include<pcl/io/pcd_io.h>
#include<pcl/console/print.h>
#include<pcl/console/parse.h>
#include <boost/algorithm/string.hpp>using namespace std;
using namespace pcl;
using namespace pcl::io;
using namespace pcl::console;bool loadCloud(const string& filename, PointCloud<PointNormal>& cloud)
{ifstream fs;fs.open(filename.c_str(), ios::binary);if (!fs.is_open() || fs.fail()){PCL_ERROR("Could not open file '%s'! Error : %s\n", filename.c_str(), strerror(errno));fs.close();return(false);}string line;vector<string> st;while (!fs.eof()){getline(fs, line);if (line.empty()){continue;}boost::trim(line);// #include <boost/algorithm/string.hpp>包含头文件,才可以使用split分割。boost::split(st, line, boost::is_any_of(" "), boost::token_compress_on);// 分割符是空格。//cout << "st.size() = " << st.size() << endl;if (st.size() != 6)continue;pcl::PointNormal point;point.x = float(atof(st[0].c_str()));point.y = float(atof(st[1].c_str()));point.z = float(atof(st[2].c_str()));point.normal[0]= float(atof(st[3].c_str()));point.normal[1]= float(atof(st[4].c_str()));point.normal[2]= float(atof(st[5].c_str()));cloud.push_back(point);}fs.close();cloud.width = uint32_t(cloud.size());cloud.height = 1;cloud.is_dense = true;return (true);
}int main()
{string XYZfileName = "camel.xyz";string PCDfileName = "camel.pcd";PointCloud<PointNormal> cloud;if (!loadCloud(XYZfileName, cloud))return (-1);cout << cloud.size() << endl;//system("pause");pcl::io::savePCDFileASCII(PCDfileName, cloud);system("pause");return 0;
}

PCL笔记二:PCD解析;PCD读取;PCD与XYZ转换;相关推荐

  1. PCD文件格式详解及在PCL下读取PCD文件

    一.PCD简介 1.1 PCD版本 在点云库PCL 1.0发布之前,PCD文件格式就已经发展更新了许多版本.这些新旧不同的版本用PCD_Vx来编号(例如PCD_V5.PCD_V6和PCD_V7等),分 ...

  2. PCL——从PCD文件中读取点云数据

    从PCD文件中读取点云数据 1. 示例代码 1. 示例代码 以下代码均参考PCL官方文档:https://pcl.readthedocs.io/projects/tutorials/en/master ...

  3. PCL—从PCD文件中读取点云数据(一)

    1.从PCD文件中读取点云数据 #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_ty ...

  4. python读取pcd点云/转numpy(python2+python3,非ROS环境)

    0.引言 \qquadROS的PCL库支持python读取点云,ROS1关联的是python2(2.7),ROS2关联的是python3(>=3.5),但这对于windows的用户和没装ROS的 ...

  5. PCD Lesson3:PCD文件的读取

    PCD文件的读取 #include <stdio.h>#include<boost/thread.hpp> #include<boost/timer.hpp> #i ...

  6. 使用python-open3d读取pcd,bin格式的点云,并显示

    open3d读取pcd格式点云 def read_display_pcd_pc(path):pcd=open3d.io.read_point_cloud(path)# 设置点云颜色 只能是0 1 如[ ...

  7. PCD文件的读取以及可视化

    PCD文件的读取以及可视化   在开发激光雷达相应算法的时候,经常需要生成或者读取pcd点云文件,因此本文主要编写了一个简单的读取pcd点云文件的功能包,并且能够实现可视化. [源代码] #inclu ...

  8. ROS-PCL读取pcd点云数据并在rviz中进行显示

    环境: Ubuntu18.04 ROS melodic C++ 创建工作空间和功能包 cd Downloads/ROS mkdir -p pcdreadshow_ws/src cd src catki ...

  9. Matlab 读取 pcd 文件

    Matlab 读取 pcd 文件 使用 matlab 读取 pcd 文件,代码如下: % 读取 pcd 文件,并取出 xyz 坐标 ptCloud = pcread('table.pcd'); % 可 ...

  10. 【深度学习|抓取检测|数据集】Cornell 康奈尔数据集下载及解析 txt 转 pcd格式 点云可视化

    文章目录 实现效果 数据集来源 基础知识 可视化 文件格式转换(txt 转 pcd) 实现效果 数据集来源 链接: https://pan.baidu.com/s/1IccviO-UJCoArctGV ...

最新文章

  1. PyTorch-torch.nn.AdaptiveAvgPool2d
  2. 问题 J: 寻找复读机【模拟】
  3. Redmi K50 Pro未发先火 卢伟冰:压力好大
  4. CPU使用时间问题测试
  5. 我家闺女35岁了还嫁不出去我该怎么办?
  6. XNA Game Studio 4.0 Programming 随便读,随便记 “Rendering Text”
  7. 革命!安装杜比声卡驱动
  8. 化学反应的常微分方程求解(Python)
  9. 圆跳动基础知识(几何公差)
  10. scikit-image HOG feature 提取函数使用心得。
  11. 自己设置假期的日历控件_在假期旅行时使用PC娱乐自己
  12. 【网络】VLAN 及其配置详解
  13. TESTTESTTESTTESTTESTTEST
  14. Python函数认识(二)
  15. Make your own Neural NetWork之代码详解中
  16. LTE系统名词解释及上下行过程
  17. 2022-2027年中国蛋白质粉行业市场深度分析及投资战略规划报告
  18. java 中调用支付宝支付功能的接口
  19. shell小练(二)(图形千变万化)
  20. 匠心打造高精度在线直线度测量仪

热门文章

  1. Latex 1: 解决latex中遇到一个常见错误:Improper alphabetic constant.
  2. 首发:最新CPU漏洞Meltdown详细分析
  3. 计算机主机mac地址怎么查,怎么查看电脑的Mac地址
  4. jQuery第5章上机练习3(使用jQuery变换网页效果)
  5. 六级考研单词之路-三十
  6. MTK平台 后视镜系列 声控参数调整方法
  7. 如何建立地球上任何一个区域的地形3d模型,并添加卫星或地貌贴图
  8. 基于FPGA的超声波测距(verilog)
  9. 【转载】ubuntu16.04 无线/Wifi 上网速度慢的解决方法
  10. 爬虫爬取到百度首页html,python爬虫实战之爬取百度首页的方法