转自个人博客:【转载翻译】使用Open3D和Python进行点云处理
转载自:Point Cloud Processing with Open3D and Python
本文由 Carlos Melo 发布于2024年2月12日
本文很适合初学者对三维处理、点云处理以及Open3D库进行初步了解
另外,本文是基于Python代码入门的,而C++也是类似的
近年来,在AR和空间计算技术的大力推动下,3D处理领域吸引了越来越多的关注,苹果和Meta等大公司也为其提供了支持,最近苹果就推出了Vision Pro。
这个迷人领域的核心是3D计算机视觉,这是计算机视觉的一个专门分支,专注于理解和处理来自现实世界的三维视觉数据 。
其应用范围从自动驾驶汽车的导航系统和自主机器人的操作算法到沉浸式虚拟和增强现实体验,其中的关键就是处理和解释三维信息。
本文介绍了使用Open3D库进行3D点云处理,这是一个开源库,旨在为开发人员和研究人员提供一套全面的3D数据处理工具。所有这些概念都将通过实际的Python示例进行探索,为进一步探索和应用3D数据处理技能提供坚实的基础。
关于代码下载:
- 3D机器学习领域发布的所有代码都可以在官方GitHub repo中找到。
- 这篇文章的代码都可以在这里找到。
Open3D:用于3D数据处理的现代开源库
Open3D站在3D数据处理技术的最前沿,它提供了一个开源库,显著提高了专注于处理3D数据的软件开发速度。Open3D采用清晰直观的API设计,为开发人员和研究人员提供了一套强大的数据结构和3D计算算法,并支持c++和Python
Open3D的核心功能经过精心设计,涵盖了3D数据处理的各个方面,包括对3D数据结构和处理算法的全面支持,对于场景重建、表面对齐和3D可视化等任务至关重要
此外,该库通过提供基于物理的渲染(PBR)超越了传统的处理能力,为3D模型增加了一层真实感,并支持3D机器学习,允许与流行的框架(如PyTorch和TensorFlow)集成。
Open3D对GPU加速的支持显著提高了核心3D操作的效率,有利于需要实时处理和可视化3D数据的应用程序,例如交互式AR/VR体验,机器人和自动车辆导航。
3D 形状的表示方法
在三维数据处理中,形状以两种主要方式表示:栅格化和几何形式。
-
栅格化表示使用规则网格,包括多视图图像、深度图和体积数据。多视图图像从不同角度捕获物体,深度图记录从视点到物体表面的距离,而体积表示使用体素网格来模拟3D空间中的物体。
-
几何表示在另一方面通过不规则的、离散的元素来模拟形状。这类网格包括多边形网格,由顶点、边和面组成;点云是三维坐标系中的顶点集合;以及基于原语的CAD模型,它使用几何原语(如球体、立方体和圆柱体)来构造复杂的形状。
每种表示都有其特定的应用和优势,栅格化形式对基于图像的3D重建很有用,几何形式在建模和仿真中提供精度。
三维点云数据集的不同数据表示如下:(由Florent Poux, Ph.D.提供)
1.3D点云示例:
2.空中激光雷达生成的模拟点云示例:
3.shell表示示例:
4.通过体素化的实体3D模型示例:
点云的理论基础
点云是表面表现的一种基本形式,以分布在物体表面上的离散点的形式捕捉物体的本质。在数学上,点云可以定义为一个集合 P = { p 1 , p 2 , … , p n } P = \{p_1,p_2,…,p_n\} P={p1,p2,…,pn},其中每个 p i ∈ R 3 p_i \in \mathbb{R}^3 pi∈R3表示三维空间中的一个点,坐标对应于它的位置。
这种简单性允许从环境中直接获取空间数据,使点云成为计算机视觉、计算机图形学和机器人技术等领域不可或缺的工具。经济实惠的3D传感器的推广进一步普及了对点云数据的访问,使从详细的环境映射到复杂的对象识别任务的广泛应用成为可能。
为点云处理设计的算法通常依赖于数据中的空间关系和密度变化来推断表面属性和物体边界。为了从原始点云数据中获得有意义的解释,通常采用诸如构造k-d树以进行有效的最近邻搜索或应用表面重建算法(如泊松重建或alpha形状)等技术。
尽管它们很简单,但点云封装了一组关于物理对象的几何和拓扑的丰富信息,在许多技术领域中充当数字世界和物理世界之间的关键桥梁。
Python快速入门Open3D
在本节中,我们将深入了解使用Open3D的基础知识,这是一个用于3D数据处理的强大库,重点是点云可视化。Open3D简化了3D数据的操作和可视化,使开发人员可以跨不同平台(如Ubuntu, macOS和Windows)使用Python版本3.8到3.11访问它。
安装与验证
要开始使用Open3D,您可以使用pip安装它。有两种可用的安装选项:标准版本安装和x86_64 Linux系统的仅cpu版本安装,后者更小,可能更适合没有专用GPU的环境。
pip install open3d # Standard installation
pip install open3d-cpu # CPU-only installation for Linux
安装后,通过检查版本来验证Open3D是否正确安装是一个很好的做法。这可以用Python中的一个简单的一行命令来完成。
python -c "import open3d as o3d; print(o3d.__version__)"
**Open3D还提供了用于3D数据处理和可视化的Python API,**以及用于执行预定义示例的命令行界面(CLI)。
可视化点云
本教程的核心重点是使用Open3D加载和可视化点云。这个过程从加载一个**.ply
点云文件开始,这是一个用于存储3D数据的流行格式。 而read_point_cloud
**方法用于此目的,该方法可以根据扩展名自动解码文件。
import open3d as o3d
import numpy as np
# Loading and visualizing a PLY point cloud
print("Loading a PLY point cloud, printing, and rendering...")
ply_point_cloud = o3d.data.PLYPointCloud()
pcd = o3d.io.read_point_cloud(ply_point_cloud.path)
# Printing point cloud information and points array
print(pcd)
print(np.asarray(pcd.points))
# Setting visualization parameters
view_params = {
"zoom": 0.3412,
"front": [0.4257, -0.2125, -0.8795],
"lookat": [2.6172, 2.0475, 1.532],
"up": [-0.0694, -0.9768, 0.2024]
}
# Rendering the point cloud
o3d.visualization.draw_geometries([pcd], **view_params)
加载点云后,我们可以通过打印pcd对象和它包含的点数组来检查它。可视化是由**draw_geometries
**函数处理的,它提供了对包含在点云中的结构和数据的可视化功能。这个强大的功能在一个窗口中渲染点云,允许用户与3D数据进行交互。另外,调整一些参数有助于调整相机的视角,便于生成下采样后数据结构的各种详细视图。
可视化可能会给人稠密表面的印象,然而,重要的是要记住,我们所看到的只是一个被渲染成曲面的点云。 Open3D的GUI提供了额外的功能,例如通过键盘快捷键调整点的大小,增强了可视化体验。例如,按**-
**键可以减小点的大小,从而提供不同的数据视角。
体素下采样
该过程应用体素网格来均匀下采样输入点云。它缩减了点云数据,以提高进一步处理步骤的计算效率。该方法的原理是将点分组到体素中,然后将每个体素中的点平均到单个位置。
用这个方法很有效地减少了点的数量,保持了原始点云的总体形状和特征。
print("Downsampling the point cloud with a voxel size of 0.05")
# Applying voxel downsampling
downpcd = pcd.voxel_down_sample(voxel_size=0.05)
# Setting visualization parameters for the downsampled point cloud
downsample_view_params = {
"zoom": 0.3412,
"front": [0.4257, -0.2125, -0.8795],
"lookat": [2.6172, 2.0475, 1.532],
"up": [-0.0694, -0.9768, 0.2024]
}
# Rendering the downsampled point cloud
o3d.visualization.draw_geometries([downpcd], **downsample_view_params)
在体素下采样代码片段中,该过程从指定体素大小0.05开始,这确定了下采样网格的分辨率。在原始点云 pcd
上调用 voxel_down_sample
函数,通过将每个体素内的点平均到单个点来降低其密度。这会得到downpcd
,即原始点云的下采样版本。
然后使用o3d.visualization.draw_geometries
函数来可视化downpcd
。设置zoom
、front
、lookat
和up
等参数来配置视角和位置,从而提供下采样点云的清晰可视化。
顶点法线估计
顶点法线估计计算云中每个点的法线,这对于许多 3D 处理任务至关重要。按 N
可以启用查看法线,使用 -
和 +
调整法线长度。此函数通过识别相邻点并使用协方差分析找到主轴来计算法线。
KDTreeSearchParamHybrid
实例指定搜索半径和最大最近邻,控制正常估计的细节以平衡准确性和计算负荷。
print("Recomputing normals for the downsampled point cloud")
# Estimating normals for the downsampled point cloud
downpcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
# Visualization parameters for displaying normals
normals_view_params = {
"zoom": 0.3412,
"front": [0.4257, -0.2125, -0.8795],
"lookat": [2.6172, 2.0475, 1.532],
"up": [-0.0694, -0.9768, 0.2024],
"point_show_normal": **True**
}
# Rendering the downsampled point cloud with normals
o3d.visualization.draw_geometries([downpcd], **normals_view_params)
在顶点法线估计代码中,操作首先在下采样点云downpcd
上调用estimate_normals
。此函数计算每个点的法线,这对于许多 3D 处理任务(如渲染、模拟和进一步的几何分析)至关重要。search_param
参数指定如何计算法线,使用 KD 树高效地找到附近的点。
这里,o3d.geometry.KDTreeSearchParamHybrid
配置 radius
为 0.1 和 max_nn
(最大最近邻)为 30。此配置通过将搜索限制在 10 厘米的半径内并为每个点考虑最多 30 个邻居,平衡了法线估计的精度和计算效率。
在计算法线之后,o3d.visualization.draw_geometries
函数将启用法线的下采样点云进行可视化。
总结
-
Open3D 的作用:Open3D 是 3D 数据处理的重要库,支持 C++ 和 Python,可实现复杂的 3D 数据操作。它支持从 3D 计算机视觉到 AR-VR 和机器人等一系列应用。
-
3D 形状表示:本文介绍了光栅化和几何形式作为 3D 形状表示的两种主要方法。光栅化形式包括多视图图像和体积数据,而几何形式则涵盖多边形网格和点云。
-
点云基础知识:点云是一种简单但信息丰富的表面表示形式,对于环境测绘和物体识别等任务至关重要。本文介绍了点云的数学定义及其在计算机视觉和机器人技术中的重要性。
-
Python 快速入门指南:提供了使用 Python 进行 Open3D 的快速入门指南,包括安装说明和加载、可视化和下采样点云等基本操作,提供了 Open3D 功能的实用介绍。
-
Open3D 的实际用途:本文展示了 Open3D 的实用性,为点云可视化、体素下采样和顶点法线估计等任务提供了 Python 示例。这些示例突出了 Open3D 在处理和可视化 3D 数据方面的功能。
理解和处理点云对于各种应用都至关重要,在3D计算机视觉的背景下,Open3D库为这些任务提供了必要的工具。