赞
踩
专栏地址:https://blog.csdn.net/qq_41366026/category_12186023.html
Open3D(以下简称o3d)同时支持Python和C++接口,本部分为Python篇;C++部分将在后续更新。o3d的python接口放弃了大部分重型C++中的框架包括Boost、Ceres,转而使用了pybind11代替Boost。Python和内建高斯牛顿、列温伯格-马夸尔特等最优化方法;因此所有模块的源代码均随o3d一起分发。
o3d在python中的安装:
这里直接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())
待更新
常见的可以表示点云文件有如下几种
open3d中的点云格式:
Format | Description |
---|---|
| 每一行包含 |
| 每一行包含 |
| 每一行包含 |
| 第一行是一个整数,表示点的个数,之后的每一行可以是下列格式之一:[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类型。 |
| Polygon File Format, ply文件可以同时包含点云数据和mesh数据 |
|
在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 标头包含以下条目:
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)
...
注:有序的点云数据的组织类是与图像的矩阵结构,有固定的宽高,数据的索引可以根据行列来进行,这种数据主要来自于立体相机或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相对于上诉的其他文件格式都有更好的灵活性和速度。 其优点包括:
注意:
虽然 PCD(点云数据)是 PCL 中的原生文件格式,但 pcl_io 库同时也提供上述部分其他文件格式的数据保存和读取。
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 }
对应的模型
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。