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/Open3Dconda activate your-env-namecd 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-packagepython -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文件格式的头部定义规则如下

  HeaderVertex ListFace 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 }

对应的模型

『Open3D』安装与点云格式通识相关推荐

  1. 『OPEN3D』1.1 点云处理 python篇

    目录 1.open3d中的点云IO 2.点云的可视化 3 点云voxel下采样 4. 顶点法线估计 5.最小外界矩 6. 凸包计算 7. 点云距离计算 8. DBSCAN clustering聚类 9 ...

  2. 微软云盘配合服务器,『原创』开源5T微软云盘搭建教程onedrive index

    前言 为什么搭建一个微软共享云盘?百度云.蓝奏云不好吗?百度云有会员限制功能,各种限制更是不少,蓝奏云速度超快,但是貌似不支持大文件.微软毕竟是大厂,可用的5T教育邮箱现在也很好搞到,之所以采用是因为 ...

  3. 『OPEN3D』1.3 RGB-D image与点云拼接 python篇

    目录 1 open3d中的IMAGE 1.1 open3d中的image 1.2 open3d中的rgbd image 2 open3d.camera 3 RGBD图像的点云拼接 1 open3d中的 ...

  4. 『OPEN3D』1.6 Voxelization体素化

    目录 1 从triangle meshes中创建体素 2 从点云中创建体素 3 体素包含测试(Inclusion test) 4 Voxel carving 在点云处理的内容中,简单介绍了open3d ...

  5. 『ORACLE』安装oracle(11g)

    一.操作系统安装,在vmware下安装Linux (OEL5.6),用于数据库服务器 1.打开vmware,选择"创建新的虚拟机" 2.选择自定义安装 3.选择虚拟机硬件兼容性(默 ...

  6. Ubuntu18.04安装显卡驱动导致开机时卡在『ok』‘starting Gnome display manager

    #Ubuntu18.04安装显卡驱动导致开机时卡在『ok』'starting Gnome display manager' 新手小白第一次安装显卡驱动,reboot之后就一直进不去,冷静下来开始寻找c ...

  7. 『实践』VirtualBox 5.1.18+Centos 6.8+hadoop 2.7.3搭建hadoop完全分布式集群及基于HDFS的网盘实现...

    『实践』VirtualBox 5.1.18+Centos 6.8+hadoop 2.7.3搭建hadoop完全分布式集群及基于HDFS的网盘实现 1.基本设定和软件版本 主机名 ip 对应角色 mas ...

  8. Python爬虫追美剧?你咋这么溜溜溜『上篇』

    皮爷不知道大家有多少人是喜欢看美剧? 反正皮爷是个美剧迷,不能说狂,但是看美剧的时间也有差不多10年了.硬生生的把好多部剧都追到了完结. 最早以前,网上资源还不是很严的时候,找个美剧是十分简单的.可是 ...

  9. 『Hadoop』MapReduce 处理 日志log(单机版)

    博客引流 本文为Hadoop单机版,伪分布版请移步『HDFS』伪分布式Hadoop集群 10.2晚又出现上次CPU打满 于是痛定思痛 检查了下业务流程 发现处理日志和build两块很吃内存 尤其是日志 ...

最新文章

  1. NE 题库 38个知识点总结
  2. 【论文解读】MV3D-Net、AVOD-Ne用于自动驾驶的多视图3D目标检测网络
  3. php如何使用正则表达式,php如何使用正则表达式实现替换
  4. ​Java Map中那些巧妙的设计
  5. 今日重磅!恺明大神又一力作!重新思考万能的ImageNet预训练模型
  6. Codeforces 847H - Load Testing
  7. java 获取本机的ip和mac_java获取本机ip和mac地址
  8. 如何使用CSS为文本或图像提供透明背景?
  9. 头秃,在线求名字:网易使用昵称交流,再也没有“哥,姐,总”!
  10. linux音频设备节点,Linux音频驱动之三:PCM设备的创建
  11. 手动绘制DataTable
  12. eve-ng 添加dynamips镜像文件
  13. efl是什么意思_efl是什么意思
  14. 设计一个算法,通过一趟遍历确定长度为n的但链表的中值的最大的节点
  15. pathon包傻瓜升级
  16. 单核CPU与多核CPU的区别,多线程的优点,什么是并行?并发?
  17. Cadence PCB仿真使用Allegro PCB SI 创建含差分对网络元器件的IBIS模型图文教程
  18. 虹科ELPRO - EMS系统实现苏州某医药仓库温湿度自动监测 - 100% GxP合规
  19. 银河麒麟系统配置外网源
  20. 大咖说丨山石网科任亮:不懂CWPP,何以谈云安全?

热门文章

  1. 如何用express写接口
  2. 如何通过组策略配置proxy.pac
  3. 探链典型应用案例介绍之确权存证:区块链云版权
  4. 李蕾声优课全集听课笔记(持续更新ing...)
  5. 【解决谷歌浏览器首页被篡改问题】
  6. Proto3使用指南
  7. swing中播放音频文件,封装成类,完美应用
  8. [暖冬限定]DevExpress WinForms冬季款皮肤/主题全新上线
  9. python 在命令行中提示 indentationError:expected an indented block
  10. 6阶子群同构于s3或者z6_浙江省月自考近世代数试卷