『Open3D』安装与点云格式通识

专栏地址:https://blog.csdn.net/qq_41366026/category_12186023.html

Open3D安装测试

        Open3D(以下简称o3d)同时支持Python和C++接口,本部分为Python篇;C++部分将在后续更新。o3d的python接口放弃了大部分重型C++中的框架包括Boost、Ceres,转而使用了pybind11代替Boost。Python和内建高斯牛顿、列温伯格-马夸尔特等最优化方法;因此所有模块的源代码均随o3d一起分发。

        o3d在python中的安装:

  1. 可以直接使用pip安装稳定版本

  2. 或自行git官方代码库进行wheel包构建(待更新)

这里直接pip安装即可,但注意最好安装在conda等虚拟环境中。

        o3d的python包当前支持python3.7-3.10,支持ubuntu18.04、macOS10.15+、Windows 10 (64-bit),如果是其他的操作系统或其他的python版本可以使用第二种方法自行构建对应的wheel包。

1、pip安装open3d (pip version>=20.3否则先pip install -U pip>=20.3 ):

pip install open3d

非虚拟环境的pip安装需要指定--user选项,以避免权限问题

pip install --user open3d

安装后可以用以下命令进行验证:

# Verify installation
python -c "import open3d as o3d; print(o3d.__version__)"

# Python API
python -c "import open3d as o3d; \
           mesh = o3d.geometry.TriangleMesh.create_sphere(); \
           mesh.compute_vertex_normals(); \
           o3d.visualization.draw(mesh, raw_mode=True)"

# Open3D CLI
open3d example visualization/draw

测试中导入Open3D如果出错的话,请打开警告来帮助Debug

python -W default -c "import open3d as o3d"

2、自行构建wheel包并安装

使用-DBUILD_CUDA_MODULE=ON,编译带有cuda支持的open3d

git clone https://github.com/isl-org/Open3D

conda activate your-env-name

cd Open3D
mkdir build
cd build
cmake -DBUILD_CUDA_MODULE=ON -DDEVELOPER_BUILD=OFF ..
cmake --build . --config Release --parallel $env:NUMBER_OF_PROCESSORS --target install-pip-package

python -c 'import open3d as o3d; print(o3d.core.cuda.is_available())

o3d在C++中的安装与使用:

                待更新


点云格式通识

常见的可以表示点云文件有如下几种

  1. .las,.laz(LiDAR数据的工业标准格式,是一种二进制文件格式)
  2. .pcd(PCL库官方指定格式)
  3. .obj(是由Alias|Wavefront Techonologies公司从几何学上定义的3D模型文件格式,是一种文本文件)
  4. .pcap(现在流行的Velodyne公司出品的激光雷达默认采集数据的二进制文件格式)
  5. .ply(一种由斯坦福大学的Turk等人设计开发的多边形文件格式,因而也被成为斯坦福三角格式。文件格式有文本和二进制两种格式)
  6. .pts(被称之为最简便的点云格式,属于文本格式。只包含点坐标信息,按X Y Z顺序存储)
  7. .xyz,.txt(一种文本格式)
  8. LAS是点云文件的一种,LAS文件是根据几种规格打包的二进制文件,LAS文件只要是俩部分:点云规格、点云点数据
  9. STL是3D Systems创建的立体光刻CAD软件的原生文件格式
  10. X3D用于表示3D计算机图形数据的基于ISO标准XML的文件格式
  11. .bin二进制化后的点云数据,提升IO速度

         open3d中的点云格式:

Format

Description

xyz

每一行包含 [x, y, z]三哪个数值, xyz 是三维坐标

xyzn

每一行包含 [x, y, z, nx, ny, nz], 其中 nxnynz 是该方向上的法向量

xyzrgb

每一行包含 [x, y, z, r, g, b], rgb代表该点颜色数值表达位[0, 1]之间的浮点数

pts

第一行是一个整数,表示点的个数,之后的每一行可以是下列格式之一:[x, y, z, i, r, g, b], [x, y, z, r, g, b], [x, y, z, i] or [x, y, z],其中x,y,z和i是double类型,r,g,b是uint8类型。

ply

 Polygon File Format, ply文件可以同时包含点云数据和mesh数据

pcd

 Point Cloud Data

pcd文件格式介绍:

        在PCL库1.0版本到来之前,PCD文件已经经历过多个版本的发展,比如(PCD_V5, PCD_V6, PCD_V7,等等)(应用在PCL中,当前Open3D与pcd格式数据存在兼容问题,但可以进行修改使其配对):

当前PCL官方主要以PCD_V7(0.7)版本为标准。

例:一个标准的PCD_V7文件格式片段如下

# .PCD v.7 - Point Cloud Data file format
VERSION .7
FIELDS x y z rgb
SIZE 4 4 4 4
TYPE F F F F
COUNT 1 1 1 1
WIDTH 213
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 213
DATA ascii
0.93773 0.33763 0 4.2108e+06
0.90805 0.35641 0 4.2108e+06
0.81915 0.32 0 4.2108e+06
0.97192 0.278 0 4.2108e+06
0.944 0.29474 0 4.2108e+06
...
...
...
0.98111 0.24247 0 4.2108e+06
0.93655 0.26143 0 4.2108e+06
0.91631 0.27442 0 4.2108e+06
0.81921 0.29315 0 4.2108e+06
0.90701 0.24109 0 4.2108e+06
0.83239 0.23398 0 4.2108e+06

文件格式解析:

        PCD文件头部包含了这份存储点云的格式信息,且pcd的头部信息必须以ASCII进行编码,但数据内容可以是二进制编码或ASCII编码

        在 PCD 文件中指定的每个标题条目以及 ascii 点数据(见下文)都使用新行 (\n) 分隔。

从 0.7 版开始,PCD 标头包含以下条目:

  • VERSION -指定 当前文件使用的PCD 版本
  • FIELDS - 指定点可以具有的每个维度/字段的名称。 例子:

                FIELDS x y z                                # XYZ 数据
                FIELDS x y z rgb                            # XYZ + 颜色数据
                FIELDS x y z normal_x normal_y normal_z     # XYZ + 表面法线数据
                FIELDS j1 j2 j3                             # XYZ + 不变矩(moment invariants)
                ...

  • SIZE -以字节为单位指定每个维度的大小。 例子:
    • unsigned char/char 大小为 1 byte
    • unsigned short/short 大小为 2 bytes
    • unsigned int/int/float 大小为 4 bytes
    • double 大小为 8 bytes
  • TYPE -将每个维度的类型指定为 char。 当前接受的类型是:
    • I - 表示有符号类型 int8 (char)、int16 (short) 和 int32 (int)
    • U -代表无符号类型 uint8 (unsigned char), uint16 (unsigned short), uint32 (unsigned int)
    • F - 表示浮点类型
  • COUNT - 指定每个维度有多少个元素。 例如,x 数据通常有 1 个元素,但像 VFH 这样的特征描述符有 308 个元素。基本上这是一种在每个点引入 n-D 直方图描述符并将它们视为单个连续内存块的方法。 默认情况下,如果 COUNT 不存在,则所有维度的计数都设置为 1。
  • PCL中的WIDTH和HEIGHT
    • WIDTH - 以点数指定点云数据集的宽度。 WIDTH 有两个含义:
      • 它可以为无序的数据集指定云中的总点数(当Height为1的时候)
      • 它可以指定有序的点云数据集的宽度(一行中的总点数)
    • HEIGHT - 以点数指定点云数据集的高度。 高度有两个含义:
      • 它可以指定有组织的点云数据集的高度(行总数)
      • 对于无序的数据集,它设置为1(因此用于检查点云数据是否有序)

        注:有序的点云数据的组织类是与图像的矩阵结构,有固定的宽高,数据的索引可以根据行列来进行,这种数据主要来自于立体相机或RGBD相机;有序的点云数据因为直接直接获取相邻点之间的关系,所以最近邻操作可以更加的高效,加速PCL某些特定算法的运算速度,降低计算开销。

Example:

1、设定点云的宽为640,高位480,因此该份点云数据最大有640*480=307200这么多个点(最大的原因是,RGBD得到的某些位置数据不可靠为空,所以有效点数少于最大点数)
WIDTH 640       
HEIGHT 480      

2、设定点云的高为1,宽度为307200,从高度信息可知该份点云文件为无序点云,高度*宽度得到这份点云中一共有307200个点
WIDTH 307200
HEIGHT 1        
  • VIEWPOINT - 指定数据集中点的采集视点。 这可能会在以后用于构建不同坐标系之间的转换,或用于辅助表面法线等需要一致方向的特征。

    视点信息被指定为平移(tx ty tz)+ 四元数(qw qx qy qz)。 默认值为:

    VIEWPOINT 0 0 0 1 0 0 0
  • POINTS -指定云中的总点数。 从 0.7 版开始,它的用途有点多余,因此我们希望在未来的版本中将其删除。

    Example:

    POINTS 213   # the total number of points in the cloud
  • DATA - 指定存储点云数据的数据类型。从 0.7 版开始,支持三种数据类型:ascii、binary 和 binary_compressed。 有关详细信息,请参阅下一节。

pcd格式规定,上述的条目必须以给出的顺序进行指定。

在DATA之后的下一字节就属于正式的点云数据,并会被解释为点云数据的一部分

点云数据存储类型:

在pcd v0.7的版本使用了三种不同的模式存储数据

1、 ASCII形式,每一个点的数据都会在新的一行

point_1
point_2
point_3
point_4
...
point_n

注意:从 PCL 版本 1.0.1 开始,NaN 的字符串表示为“nan”。

2、二进制形式(binary form),其中数据是 pcl::PointCloud.points array/vector的完整内存副本。 在 Linux 系统上,我们使用 mmap/munmap 操作以尽可能快地读取/写入数据。

3、以二进制压缩形式(binary_compressed form)。 正文(标头信息之后的所有内容)以 32 位无符号二进制数开头,指定压缩形式数据的大小(以字节为单位)。 接下来是另一个 32 位无符号二进制数,它指定未压缩形式的数据的大小(以字节为单位)。 然后是压缩数据。 压缩和解压缩是使用 Marc Lehmann 的 LZF 算法完成的。 在压缩率方面一般,但压缩速度非常快。 对于典型的点云,压缩数据具有原始大小的 30% 到 60%。 在压缩之前,数据被重新排序以改进压缩,从标准的结构数组布局(array-of-structures layout)到数组结构布局(structure-of-arrays layout)。 因此,例如具有三个点和其对应的三项数据 x、y、z 的云将从 xyzxyzxyz 重新排序为 xxxyyyzzz。

        以简单的 ascii 格式存储点云数据,每个点在一行上,使用空格或制表符进行分隔,上面没有任何其他字符,但同时以二进制格式进行转储,可是根据地层的应用程序得到便捷性和速度的提升。 ascii 格式的pcd文件允许用户打开点云文件并使用 gnuplot 等标准软件工具绘制它们,或使用 sed、awk 等工具对其进行操作。
 

PCD与其他文件格式相比的优势:

        PCD相对于上诉的其他文件格式都有更好的灵活性和速度。 其优点包括:

  • 存储和处理有组织的点云数据集的能力——这对于实时应用和增强现实、机器人等研究领域极为重要;
  • 二进制 mmap/munmap 数据类型是将数据加载和保存到磁盘的最快方式。
  • 存储不同的数据类型(支持的所有原语:char、short、int、float、double)允许点云数据在存储和处理方面灵活高效。 无效的点尺寸通常存储为 NAN 类型。
  • 特征描述符的 n-D 直方图——对于 3D 感知/计算机视觉应用非常重要

注意:

        虽然 PCD(点云数据)是 PCL 中的原生文件格式,但 pcl_io 库同时也提供上述部分其他文件格式的数据保存和读取。
 


ply文件格式介绍:

        PLY全称Polygon File Forma(多边形文件格式),是斯坦福大学开发的一套三维mesh模型数据格式。PLY文件有两种形式,ASCII:用于轻松启动,(binary format)二进制格式:用于紧凑存储和快速保存和加载。

        ply文件格式描述的是vertices(顶点), faces(面片) and other elements(其他元素包括但不限于颜色、曲面法线、纹理坐标、透明度、range data cofidence以及多边形前后的不同属性信息)的集合,同时还可以包含每个元素对应的法向量方向和颜色信息,一个ply文件包含一个物体的描述信息。

例:一个标准的ply文件格式的头部定义规则如下

  Header
  Vertex List
  Face List
  (lists of other elements)

例:一个标准的ply文件格式片段如下

ply
format ascii 1.0           { ascii/binary, format version number }
comment made by Greg Turk  { comments keyword specified, like all lines }
comment this file is a cube
element vertex 8           { define "vertex" element, 8 of them in file }
property float x           { vertex contains float "x" coordinate }
property float y           { y coordinate is also a vertex property }
property float z           { z coordinate, too }
element face 6             { there are 6 "face" elements in the file }
property list uchar int vertex_index { "vertex_indices" is a list of ints }
end_header                 { delimits the end of the header }
0 0 0                      { start of vertex list }
0 0 1
0 1 1
0 1 0
1 0 0
1 0 1
1 1 1
1 1 0
4 0 1 2 3                  { start of face list }
4 7 6 5 4
4 0 4 5 1
4 1 5 6 2
4 2 6 7 3
4 3 7 4 0

        其中对于顶点的定义坐标是x,y,z,对于faces(面片)的描述由顶点列表中的索引描述;其中vertex和faces都属于ply定义中的elements(元素),因此对应上面的那句红字组成的话。因此在使用中可以轻松的根据这个性质来添加自己的属性到文件中,且不会影响原来的文件信息。同时,在被程序读取或使用中,只有程序可以解释的元素会被加载,无法被程序解释的元素信息则会被丢弃,因此各位在自己的应用程序中可以高效的使用ply文件的这个特性。

文件结构解析: 

 

         文件头部信息定义了点云文件的内容,每一行以回车结尾;头部信息中包含了对每个元素类型的描述,包括元素的名称(比如:边、面、点)、该元素在的数量、和关联到该元素上的属性或结构信息。同时头文件定义了点云数据是以ASCII格式还是二进制格式进行的数据存储。定义完元素信息后,使用property定义该元素对应的属性。

         以上面的片段信息为例,该片段是一个以ASCII定义的立方体模型,其中{}号内为注释信息,可以将所有{}删除后保存在txt文件后,将该文件改名为.ply文件,使用meshlab打开可以查看到该模型。

注:ubuntu中可以直接使用以下命令安装meshlab

sudo apt install meshlab

 注:#号后为注释信息

#所有的ply文件都必须以ply开头
ply
#format 定义了该份ply文件的编码方式,ascii使用binary_little_endian编码,
binary使用binary_big_endian编码,1.0为版本号
format ascii 1.0
#comment 定义了ply格式中的注释信息
comment made by Greg Turk
comment this file is a cube
#element 创建了一个名为vertex的元素信息,数量为8个
element vertex 8
#property 定义了vertex中的一个属性,float类型,名称分别为x,y,z
property float x
property float y
property float z
#使用element创建了一个新的元素信息,名称为face,数量为6个
element face 6
#property list 定义一个名为vertex_index的列表,其数据类型为int
#uchar表示每一行列表中包含多少个数据
property list uchar int vertex_index
# 所有的ply头文件定义以end_header结尾,之后的数据为正式的模型数据
end_header
0 0 0   #一个顶点数据
0 0 1
0 1 1
0 1 0
1 0 0
1 0 1
1 1 1
1 1 0
4 0 1 2 3   # face数据,4为后面列表数据的长度;列表中的每个数代表的是顶点的索引构成一个面
4 7 6 5 4
4 0 4 5 1
4 1 5 6 2
4 2 6 7 3
4 3 7 4 0

NOTE:face列表中的三角面生成按照TRIANGLE FAN的方式进行生成,不是以TRIANGLE STRIP生成。所以上面的4 0 1 2 3有点0,1,2和点0,2,3两个三角形面组成一个正方形的面

TRIANGLE FAN与TRIANGLE STRIP图解可以查看以下的博客

triangle fan 和 triangle strip_tomorrow_opal的博客-CSDN博客_三角形 fan

ply规定的数据类型与大小:

另一个ply文件片段,这次加上了颜色和边信息:

ply
format ascii 1.0
comment author: Greg Turk
comment object: another cube
element vertex 8
property float x
property float y
property float z
property uchar red                   { start of vertex color }
property uchar green
property uchar blue
element face 7
property list uchar int vertex_index  { number of vertices for each face }
element edge 5                        { five edges in object }
property int vertex1                  { index to first vertex of edge }
property int vertex2                  { index to second vertex }
property uchar red                    { start of edge color }
property uchar green
property uchar blue
end_header
0 0 0 255 0 0                         { start of vertex list }
0 0 1 255 0 0
0 1 1 255 0 0
0 1 0 255 0 0
1 0 0 0 0 255
1 0 1 0 0 255
1 1 1 0 0 255
1 1 0 0 0 255
3 0 1 2                           { start of face list, begin with a triangle }
3 0 2 3                           { another triangle }
4 7 6 5 4                         { now some quadrilaterals }
4 0 4 5 1
4 1 5 6 2
4 2 6 7 3
4 3 7 4 0
0 1 255 255 255                   { start of edge list, begin with white edge }
1 2 255 255 255
2 3 255 255 255
3 0 255 255 255
2 0 0 0 0                         { end with a single black line }

对应的模型

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NNNNNathan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值