PCL笔记二:PCD解析;PCD读取;PCD与XYZ转换;
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转换;相关推荐
- PCD文件格式详解及在PCL下读取PCD文件
一.PCD简介 1.1 PCD版本 在点云库PCL 1.0发布之前,PCD文件格式就已经发展更新了许多版本.这些新旧不同的版本用PCD_Vx来编号(例如PCD_V5.PCD_V6和PCD_V7等),分 ...
- PCL——从PCD文件中读取点云数据
从PCD文件中读取点云数据 1. 示例代码 1. 示例代码 以下代码均参考PCL官方文档:https://pcl.readthedocs.io/projects/tutorials/en/master ...
- PCL—从PCD文件中读取点云数据(一)
1.从PCD文件中读取点云数据 #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_ty ...
- python读取pcd点云/转numpy(python2+python3,非ROS环境)
0.引言 \qquadROS的PCL库支持python读取点云,ROS1关联的是python2(2.7),ROS2关联的是python3(>=3.5),但这对于windows的用户和没装ROS的 ...
- PCD Lesson3:PCD文件的读取
PCD文件的读取 #include <stdio.h>#include<boost/thread.hpp> #include<boost/timer.hpp> #i ...
- 使用python-open3d读取pcd,bin格式的点云,并显示
open3d读取pcd格式点云 def read_display_pcd_pc(path):pcd=open3d.io.read_point_cloud(path)# 设置点云颜色 只能是0 1 如[ ...
- PCD文件的读取以及可视化
PCD文件的读取以及可视化 在开发激光雷达相应算法的时候,经常需要生成或者读取pcd点云文件,因此本文主要编写了一个简单的读取pcd点云文件的功能包,并且能够实现可视化. [源代码] #inclu ...
- ROS-PCL读取pcd点云数据并在rviz中进行显示
环境: Ubuntu18.04 ROS melodic C++ 创建工作空间和功能包 cd Downloads/ROS mkdir -p pcdreadshow_ws/src cd src catki ...
- Matlab 读取 pcd 文件
Matlab 读取 pcd 文件 使用 matlab 读取 pcd 文件,代码如下: % 读取 pcd 文件,并取出 xyz 坐标 ptCloud = pcread('table.pcd'); % 可 ...
- 【深度学习|抓取检测|数据集】Cornell 康奈尔数据集下载及解析 txt 转 pcd格式 点云可视化
文章目录 实现效果 数据集来源 基础知识 可视化 文件格式转换(txt 转 pcd) 实现效果 数据集来源 链接: https://pan.baidu.com/s/1IccviO-UJCoArctGV ...
最新文章
- PyTorch-torch.nn.AdaptiveAvgPool2d
- 问题 J: 寻找复读机【模拟】
- Redmi K50 Pro未发先火 卢伟冰:压力好大
- CPU使用时间问题测试
- 我家闺女35岁了还嫁不出去我该怎么办?
- XNA Game Studio 4.0 Programming 随便读,随便记 “Rendering Text”
- 革命!安装杜比声卡驱动
- 化学反应的常微分方程求解(Python)
- 圆跳动基础知识(几何公差)
- scikit-image HOG feature 提取函数使用心得。
- 自己设置假期的日历控件_在假期旅行时使用PC娱乐自己
- 【网络】VLAN 及其配置详解
- TESTTESTTESTTESTTESTTEST
- Python函数认识(二)
- Make your own Neural NetWork之代码详解中
- LTE系统名词解释及上下行过程
- 2022-2027年中国蛋白质粉行业市场深度分析及投资战略规划报告
- java 中调用支付宝支付功能的接口
- shell小练(二)(图形千变万化)
- 匠心打造高精度在线直线度测量仪
热门文章
- Latex 1: 解决latex中遇到一个常见错误:Improper alphabetic constant.
- 首发:最新CPU漏洞Meltdown详细分析
- 计算机主机mac地址怎么查,怎么查看电脑的Mac地址
- jQuery第5章上机练习3(使用jQuery变换网页效果)
- 六级考研单词之路-三十
- MTK平台 后视镜系列 声控参数调整方法
- 如何建立地球上任何一个区域的地形3d模型,并添加卫星或地貌贴图
- 基于FPGA的超声波测距(verilog)
- 【转载】ubuntu16.04 无线/Wifi 上网速度慢的解决方法
- 爬虫爬取到百度首页html,python爬虫实战之爬取百度首页的方法