专栏地址: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中的安装:
-
可以直接使用pip安装稳定版本
-
或自行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++中的安装与使用:
待更新
点云格式通识
常见的可以表示点云文件有如下几种
- .las,.laz(LiDAR数据的工业标准格式,是一种二进制文件格式)
- .pcd(PCL库官方指定格式)
- .obj(是由Alias|Wavefront Techonologies公司从几何学上定义的3D模型文件格式,是一种文本文件)
- .pcap(现在流行的Velodyne公司出品的激光雷达默认采集数据的二进制文件格式)
- .ply(一种由斯坦福大学的Turk等人设计开发的多边形文件格式,因而也被成为斯坦福三角格式。文件格式有文本和二进制两种格式)
- .pts(被称之为最简便的点云格式,属于文本格式。只包含点坐标信息,按X Y Z顺序存储)
- .xyz,.txt(一种文本格式)
- LAS是点云文件的一种,LAS文件是根据几种规格打包的二进制文件,LAS文件只要是俩部分:点云规格、点云点数据
- STL是3D Systems创建的立体光刻CAD软件的原生文件格式
- X3D用于表示3D计算机图形数据的基于ISO标准XML的文件格式
- .bin二进制化后的点云数据,提升IO速度
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数据 |
|
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(因此用于检查点云数据是否有序)
- WIDTH - 以点数指定点云数据集的宽度。 WIDTH 有两个含义:
注:有序的点云数据的组织类是与图像的矩阵结构,有固定的宽高,数据的索引可以根据行列来进行,这种数据主要来自于立体相机或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 }
对应的模型文章来源:https://www.toymoban.com/news/detail-468133.html
文章来源地址https://www.toymoban.com/news/detail-468133.html
到了这里,关于『Open3D』安装与点云格式通识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!