相关文章推荐
面冷心慈的枕头  ·  BindingSource 类 ...·  1 年前    · 

1. PCD格式说明

  • 如果打算用pcl来处理点云的话,那么点云需要先转化为pcd格式。在点云库(PCL)1.0版本发布之前,PCD文件格式有不同的修订号。这些修订号用PCD_Vx来编号(例如,PCD_V5、PCD_V6、PCD_V7等等),代表PCD文件的0.x版本号。然而PCL中PCD文件格式的正式发布是0.7版本(PCD_V7)。下面我以0.7版本为例进行说明:

  • 每一个PCD文件包含一个文件头,它确定和声明文件中存储的点云数据的某种特性。PCD文件头必须用ASCII码来编码。PCD文件中指定的每一个文件头字段以及ascii点数据都用一个新行(\n)分开了。用记事本打开一个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 460400
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 460400
DATA ascii
  • 从0.7版本开始,PCD文件头包含下面的字段:
  1. VERSION –指定PCD文件版本

  2. FIELDS –指定一个点可以有的每一个维度和字段的名字。例如:

FIELDS x y z # XYZ data
FIELDS x y z rgb # XYZ + colors
FIELDS x y z normal_xnormal_y normal_z # XYZ + surface normals
FIELDS j1 j2 j3 # moment invariants
  1. SIZE –用字节数指定每一个维度的大小。例如:
unsigned char/char has 1 byte
unsigned short/short has 2 bytes
unsignedint/int/float has 4 bytes
double has 8 bytes
  1. TYPE –用一个字符指定每一个维度的类型。现在被接受的类型有:
I – 表示有符号类型int8(char)、int16(short)和int32(int);
U – 表示无符号类型uint8(unsigned char)、uint16(unsigned short)和uint32(unsigned int);
F – 表示浮点类型。
  1. COUNT –指定每一个维度包含的元素数目。例如,x这个数据通常有一个元素,但是像VFH这样的特征描述子就有308个。实际上这是在给每一点引入n维直方图描述符的方法,把它们当做单个的连续存储块。默认情况下,如果没有COUNT,所有维度的数目被设置成1。

  2. WIDTH –用点的数量表示点云数据集的宽度。根据是有序点云还是无序点云,WIDTH有两层解释:

    • 它能确定无序数据集的点云中点的个数(和下面的POINTS一样);
    • 它能确定有序点云数据集的宽度(一行中点的数目)。

    注意:有序点云数据集,意味着点云是类似于图像(或者矩阵)的结构,数据分为行和列。这种点云的实例包括立体摄像机和时间飞行摄像机生成的数据。有序数据集的优势在于,预先了解相邻点(和像素点类似)的关系,邻域操作更加高效,这样就加速了计算并降低了PCL中某些算法的成本。

  3. HEIGHT –用点的数目表示点云数据集的高度。类似于WIDTH ,HEIGHT也有两层解释:

    • 它表示有序点云数据集的高度(行的总数);
    • 对于无序数据集它被设置成1(被用来检查一个数据集是有序还是无序)。
  4. VIEWPOINT –指定数据集中点云的获取视点。VIEWPOINT有可能在不同坐标系之间转换的时候应用,在辅助获取其他特征时也比较有用,例如曲面法线,在判断方向一致性时,需要知道视点的方位,
    视点信息被指定为平移(txtytz)+四元数(qwqxqyqz)。默认值是:
    VIEWPOINT 0 0 0 1 0 0 0

  5. POINTS –指定点云中点的总数。从0.7版本开始,该字段就有点多余了,因此有可能在将来的版本中将它移除。
    例子:
    POINTS 307200 #点云中点的总数为307200

  6. DATA –指定存储点云数据的数据类型。从0.7版本开始,支持两种数据类型:ascii和二进制。

注意
文件头最后一行(DATA)的下一个字节就被看成是点云的数据部分了,它会被解释为点云数据。以ASCLL码存储的点云数据,每一个点占据一行,“nan”表示不存在或非法的数据。

警告
PCD文件的文件头部分必须以上面的顺序精确指定,也就是如下顺序:
VERSION、FIELDS、SIZE、TYPE、COUNT、WIDTH、HEIGHT、VIEWPOINT、POINTS、DATA
之间用换行隔开。

2. ASCII和binary格式区别

计算机文件基本上分为二种:binary(二进制文件)和 ASCII(也称纯文本文件)

二进制文件:图形文件及文字处理程序等计算机程序,含有特殊的格式及计算机代码;

ASCII文件:可以用任何文字处理程序阅读的简单文本文件;

简单区别:用记事本打开,正常的就是ASCII文件,是乱码的就是二进制文件。

为什么要转换格式?计算机可以直接识别二进制文件,而读取文本文件还需要“翻译”成自己能识别的。传大量文件时,二进制文件形式传输速率自然快上不少。

3. ASCII和binary格式转换

convert.py

#!/usr/bin/env python
# encoding=utf8 
import sys
import logging
import pcl
import re
if __name__ == "__main__":
    if sys.argv.__len__() != 3:
        print "Usage: pyton ./BA.py source.pcd dest.pcd"
        print "Auto adjust the type of file: binary or ascii"
        exit(0)
    pcl_src_path = sys.argv[1]
    pcl_dest_path = sys.argv[2]
    p = re.compile("DATA (?P<data_type>\w*)")
    data_type = "unknow"
    with open(pcl_src_path, 'rt') as pcl_src_handle:    
        lines = pcl_src_handle.readlines()            
        for index in range(12):
            m = p.match(lines[index])
            try:
                data_type = m.group("data_type")
                break
            except Exception as e:
    print data_type
    if data_type == "binary":
        print "Convert binary to ascii"
        B = False
    elif data_type == "ascii":
        print "Convert ascii to binary"
        B = True
    else:
        print "Usage: pyton ./BA.py source.pcd dest.pcd"
        print "Usage: pyton ./BA.py source.pcd ascii.pcd"
        print "Usage: pyton ./BA.py ascii.pcd binary.pcd"
    pcl_file = pcl.PointCloud_PointXYZI()
    pcl_file.from_file(pcl_src_path)
    pcl_file._to_pcd_file(pcl_dest_path, B)

运行代码:

python ./convert.py 1.pcd 2.pcd

注意
若提示缺少python-pcl库:ImportError: No module named pcl,使用如下命令进行安装:

pip install python-pcl

4. 代码注释学习:

#!/usr/bin/env python
# encoding=utf8         # 开头注释,说明源程序所用编码
'''导入模块'''
import sys
import logging
import pcl
import re           
if __name__ == "__main__":          # 作用1:作为脚本直接运行;作用2:被其他脚本调用时,不会执行
    if sys.argv.__len__() != 3:         #判断输入参数的个数
        print "Usage: pyton ./BA.py source.pcd dest.pcd"
        print "Auto adjust the type of file: binary or ascii"
        exit(0)							# 正常运行程序并退出程序
    pcl_src_path = sys.argv[1]		#输入的第一个参数为 原文件路径
    pcl_dest_path = sys.argv[2]		#输入的第二个参数为 输出路径
    p = re.compile("DATA (?P<data_type>\w*)")   #正则表达式(不太懂)
    data_type = "unknow"             
    with open(pcl_src_path, 'rt') as pcl_src_handle:    # rt 读写打开一个文本文件  读写标识
        lines = pcl_src_handle.readlines()            
        for index in range(12):      # 为什么是12? 因为pcd文件前十一行是文件格式信息,后面才是点云信息
            m = p.match(lines[index])
            try:
                data_type = m.group("data_type")
                break
            except Exception as e:
    print data_type
    if data_type == "binary":
        print "Convert binary to ascii"
        B = False
    elif data_type == "ascii":
        print "Convert ascii to binary"
        B = True
    else:
        print "Usage: pyton ./BA.py source.pcd dest.pcd"
        print "Usage: pyton ./BA.py source.pcd ascii.pcd"
        print "Usage: pyton ./BA.py ascii.pcd binary.pcd"
    pcl_file = pcl.PointCloud_PointXYZI()   # 
    pcl_file.from_file(pcl_src_path)        # 
    pcl_file._to_pcd_file(pcl_dest_path, B)	 # 
 
  1. https://blog.csdn.net/ganguowa/article/details/53965304?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158457878519724848329972%2522%252C%2522scm%2522%253A%252220140713.130056874…%2522%257D&request_id=158457878519724848329972&biz_id=0&utm_source=distribute.pc_search_result.none-task#1asc%E6%A0%BC%E5%BC%8F%E7%9A%84%E8%AF%B4%E6%98%8E
  2. https://blog.csdn.net/qq_43642710/article/details/105267949?utm_medium=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.control
1. PCD格式说明如果打算用pcl来处理点云的话,那么点云需要先转化为pcd格式。在点云库(PCL)1.0版本发布之前,PCD文件格式有不同的修订号。这些修订号用PCD_Vx来编号(例如,PCD_V5、PCD_V6、PCD_V7等等),代表PCD文件的0.x版本号。然而PCL中PCD文件格式的正式发布是0.7版本(PCD_V7)。下面我以0.7版本为例进行说明:每一个PCD文件包含一个文件头,它确定和声明文件中存储的点云数据的某种特性。PCD文件头必须用ASCII码来编码。PCD文件中指定的每
python_pcd 该软件包提供了用于在纯python中处理PCL .pcd pointcloud文件的I / O代码。 有关C ++ PCL函数的Python包装,请参见 import python_pcd message = sensor_msgs . msg . PointCloud2 () # or a message from somewhere else python_pcd . write_pcd ( "this.pcd" , message ) write_pcd的定义: def write_pcd ( filename , pointcloud , overwrite = False , viewpoint = None , mode = 'binary' ): Writes a senso
4.特征描述子n维直方图-——对于3D识别和计算机视觉应用十分重要。 PCD版本类型 在点库(pcl)1.0版本发布之前,PCD文件格式有不同的修订号。用PCD_Vx来编号(such as : PCD_V5、PCD_V7),代表PCD文件中的0.x版本号。例如:PCD_V7指的是PCD文件格式是0.7版本。 文件格式 每一个PC #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/visualization/cloud_viewer.h> 声明和定义点对象: pcl::PointCloud<pcl::PointX...
三维点数据简介1 什么是点数据2 点数据格式——PCD文件2.1 下面介绍该文件每行具体所代表的含义:3 总结 1 什么是点数据     点数据是指在一个三维坐标系中的一组向量的集合。这些向量通常以X,Y,Z三维坐标的形式表示,一般主要代表一个物体的外表面几何形状,除此之外点数据还可以附带RGB信息,即每个坐标点的颜色信息,或者是其他的信息。 2 点数据格式——PCD文件
Python编程语言中,字节就像一个数组。当我们想要表示一组字节值时,我们可以考虑bytes()数据类型。bytes 数据类型只允许从 0 到 255 的值。这hex()是 python 中的内置函数之一。它将指定的整数转换为相应的十六进制值。它以“0x”为前缀。它返回一个十六进制字符串。 在本教程中,我们将学习如何使用hex()方法和binascii模块将字节转换为十六进制值。 示例:从字符串中获取字节对象 众所周知,如何将任何整数或字符串转换为字节对象。让我们从将字符串转换为字节对象开始。转换.
PCL中的3D特征PCD(Point Cloud Data)文件格式本文讲解了PCD(Point Cloud Data)的文件格式,还有在PCL中对它的用法PCD出现的背景PCD文件格式的出现,是为了弥补其他文件格式在PCL处理N维点中的各种问题。 PCD不是第一种支持3D点数据格式: - PLY - 一种多边形文件格式 - STL - CAD软件得到的格式 - OBJ - 从几何学上
void pcdBinaryOrPcdASCII(std::string fileIn, std::string fileOut, int type, int precision) pcl::PCLPointCloud2 cloud; Eigen::Vector4f origin; Eigen::Quaternionf orientation; //将文件中的数据读到cloud, origin...
不同数据格式的转化方法:ASC,PCD,PLY 最近在做PCL环境下的ICP配准,遇到了点数据格式问题,我的ICP代码时使用PLY格式的点,其他格式运行会报错,所以做了一下转换格式的方法总结。 1.ASC转PCD 在这里插入代码片 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细...
二、为何采用新得文件格式 PCD 文件格式并不是要重新发明,而是要补充现有的文件格式,这些文件格式由于某些种原因 ,不支持 PCL 为 n-D 点处理带来的某些扩展。 PCD 不是第一个支持 3D 点数据文件类型。 尤其是计算机图形和计算几何社区,已经创建了多种格式来描述使用激光扫描仪获取的任意多边形和点。...
PCL——(3)PCD(点数据文件格式简介 - 一抹烟霞 - 博客园 (cnblogs.com) The PCD (Point Cloud Data) file format — Point Cloud Library 1.12.1-dev documentation (pointclouds.org) 点坐标系: PCD 文件,header中有定义,起始的原点 VIEWPOINT有可能在不同坐标系之间转换的时候应用,在辅助获取其他特征时也比较有用,例如曲面法线,在判断方向一致性时,需要知道视
一、二进制文件说明 点数据以浮点二进制文件格式存储,每行包含8个数据,每个数据由四位十六进制数表示(浮点数),每个数据通过空格隔开。一个点数据由四个浮点数数据构成,分别表示点的x、y、z、r(强度 or 反射值),点存储方式如下表所示: 即每行包含两点的XYZI,那么只需要对一个点赋值对应的XYZI值,并将该点压入点中即可。 #include <boost/program_options.hpp> #include <pcl/point_types.h> # dbscan聚类 def dbscan_clustering(data, eps, min_samples): dbscan = DBSCAN(eps=eps, min_samples=min_samples) dbscan.fit(data) return dbscan.labels_ # 读取pcd文件 data = read_pcd_file('point_cloud.pcd') # dbscan聚类 labels = dbscan_clustering(data, eps=0.5, min_samples=10) # 输出聚类结果 print(labels) 这个代码示例使用了numpy和sklearn库,其中read_pcd_file函数用于读取pcd文件,dbscan_clustering函数用于进行dbscan聚类,最后输出聚类结果。
class myTypex { public: constexpr myTypex(const char *name, int age) :name(name), age(age) {}; const char *getname() const { return name; constexpr int getage() const { return age; private: const char *name; int age; //其它结构体成员 main里:constexpr myTypex ex{ const_cast<char *>("zhaongsisd"), 10 };; // const char *aa = ex.getname(); constexpr int age = ex.getage(); cout << aa << " " << age << endl; 才成功, 否则会出错。。。。。 【git】使用git时显示untracked files(未监控)解决办法 走zou-ting停: 前面执行完了 才看到最后一步 表情包 Ubuntu16.04安装NVIDIA驱动踩过的坑 没ろ太阳、向日葵如何微笑: 太强了兄弟,解决了一下午的困惑 匈牙利算法详解 iks325: 要考虑权重的吧 【C++11】 之 std::unique_ptr 详解 猿来是码农: 因为这些函数属于程序的文本段,即.text段,这些不属于对象,而是属于类。你调用这些函数时,其实是用对象去调用的,所以要传入对象的this指针,而如果这个函数实现里没有涉及到this指针就不会有错误,但如果函数里有涉及到成员数据,这时候肯定会用到this指针,而对象是nullptr 则必产生段错误。可以写个测试代码,有成员函数: int CTest::getValue()const printf("function getValut()\n"); int main() CTest *test = nullptr; test->getValue(); return 0; 照常可以执行,但如果成员函数里涉及到成员数据,必段错误