NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模
近年来,在 AR 和空间计算技术的大力推动下,在 Apple 和 Meta 等大公司的支持下,最近推出了 Apple Vision Pro,3D 理解领域受到越来越多的关注。
这个迷人领域的核心是 3D 计算机视觉,它是计算机视觉的一个专业分支,专注于理解和处理来自现实世界的三维视觉数据。
应用范围从自动驾驶汽车中的导航系统和自主机器人中的操作算法到沉浸式虚拟和增强现实体验。 处理和解释三维信息是这些技术发展的关键。
本文介绍使用 Open3D 库进行 3D 点云处理,这是一个开源库,旨在为开发人员和研究人员提供一套全面的 3D 数据处理工具。 所有这些概念都将通过实际的Python示例进行探索,为进一步探索和应用3D数据处理技能提供坚实的基础。
所有在 3D 机器学习领域发布的代码都可以在官方 GitHub 存储库中找到。你可以在此处找到这篇特定文章的代码。
1、Open3D:用于 3D 数据处理的现代库
Open3D 站在 3D 数据处理技术的最前沿,提供一个开源库,可显着加速专注于处理 3D 数据的软件的开发。 Open3D 采用清晰直观的 API 进行设计,使开发人员和研究人员能够轻松访问一组强大的数据结构和算法,以使用 C++ 和 Python 进行 3D 计算。
Open3D 的核心功能经过精心设计,涵盖 3D 数据处理的各个方面,包括对 3D 数据结构和处理算法的全面支持,这对于场景重建、表面对齐和 3D 可视化等任务至关重要。
此外,该库超越了传统的处理功能,提供基于物理的渲染 (PBR),为 3D 模型增加了一层真实感,并支持 3D 机器学习,允许与 PyTorch 和 TensorFlow 等流行框架集成。
Open3D 对 GPU 加速的支持显着提高了核心 3D 操作的效率,使需要实时处理和可视化 3D 数据的应用受益,例如交互式 AR/VR 体验、机器人和自动车辆导航。
2、3D 形状表示方法
在 3D 数据处理中,形状以两种主要方式表示:光栅化形式和几何形式。
光栅化表示使用规则网格,包括多视图图像、深度图和体积数据。 多视图图像从不同角度捕获物体,深度图记录从视点到物体表面的距离,体积表示使用体素网格在 3D 空间中对物体进行建模。
另一方面,几何表示通过不规则的离散元素对形状进行建模。 这一类包括多边形网格,它由顶点、边和面组成;点云,是三维坐标系中的顶点集; 基于图元的 CAD 模型,使用几何图元(例如球体、立方体和圆柱体)来构建复杂的形状。
每种表示都有其特定的应用和优势,光栅化形式可用于基于图像的 3D 重建,而几何形式可提供精确的建模和模拟。
3、点云的理论基础
点云是表面表示的一种基本形式,以分布在其表面上的离散点的形式捕获对象的本质。 从数学上讲,点云可以定义为集合 P = {p_1, p_2, ..., p_n}
,其中R^3中的每个 p_i
表示三维空间中的一个点,其坐标对应到它的位置。
这种简单性允许直接从环境中获取空间数据,使点云成为计算机视觉、计算机图形学和机器人等领域不可或缺的工具。 经济实惠的 3D 传感器的激增进一步使点云数据的访问变得大众化,从而实现了从详细的环境测绘到复杂的物体识别任务的广泛应用。
为点云处理设计的算法通常依赖于数据内的空间关系和密度变化来推断表面属性和对象边界。 通常采用诸如构建用于高效最近邻搜索的 k-d 树或应用表面重建算法(例如泊松重建或 alpha 形状)等技术来从原始点云数据中得出有意义的解释。
尽管点云很简单,但它封装了有关物理对象的几何和拓扑的丰富信息,在众多技术领域中充当数字世界和物理世界之间的关键桥梁。
4、Python Open3D 快速入门
在本节中,我们将深入介绍使用 Open3D(一个强大的 3D 数据处理库)的基础知识,重点关注点云可视化。 Open3D 简化了 3D 数据的操作和可视化,使使用 Python 版本 3.8 至 3.11 跨不同平台(例如 Ubuntu、macOS 和 Windows)工作的开发人员可以使用它。
4.1 安装与验证
要开始使用 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)。
4.2 可视化点云
本教程的核心重点是使用 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_geometry
函数处理。 这一强大的功能可在窗口中渲染点云,允许用户与 3D 数据进行交互。 这些参数有助于调整相机的视角,提供下采样后数据结构的详细视图。
可视化可能会给人一种致密表面的印象; 然而,重要的是要记住,我们看到的是渲染为面元的点云。 Open3D 的 GUI 提供了额外的功能,例如使用键盘快捷键调整点大小,增强可视化体验。 例如,按 - 键会减小点大小,从而提供不同的数据视角。
4.3 体素下采样
此过程应用体素网格对输入点云进行均匀下采样。 它简化了点云数据,以提高进一步处理步骤的计算效率。 该方法的工作原理是将点分组为体素,然后将每个体素中的点平均到单个位置。
这减少了点的数量,保持了原始点云的总体形状和特征:
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 开始,这决定了下采样网格的分辨率。 voxel_down_sample
函数在原始点云 pcd 上调用,通过将每个体素内的点平均为单个点来降低其密度。 这会产生 downpcd,即原始点云的下采样版本。
然后使用 o3d.visualization.draw_geometries
函数可视化 downpcd。 设置缩放、前视、观察和向上等参数来配置视角和位置,从而提供下采样点云的清晰可视化。
4.4 顶点法线估计
顶点法线估计计算云中每个点的法线,这对于许多 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
配置为半径为 0.1, max_nn
(最大最近邻)为 30。此配置通过将搜索限制为 10cm 半径并考虑最多 30 来平衡法线估计的精度与计算效率。 每个点的邻居。
计算法线后, o3d.visualization.draw_geometries
函数可在启用法线的情况下可视化下采样的点云。
5、结束语
Open3D 是 3D 数据处理的重要库,通过支持 C++ 和 Python 实现复杂的 3D 数据操作。 它促进了从 3D 计算机视觉到 AR/VR 和机器人技术的一系列应用。
本文解释了光栅化和几何形式作为 3D 形状表示的两种主要方法。 光栅化形式包括多视图图像和体积数据,而几何形式涵盖多边形网格和点云。
点云是一种简单但信息丰富的表面表示形式,对于环境测绘和对象识别等任务至关重要。 本文介绍了点云的数学定义及其在计算机视觉和机器人技术中的重要性。
本文提供了通过Python使用Open3D的快速入门指南,包括安装说明和加载、可视化和下采样点云等基本操作,提供了Open3D功能的实用介绍。
本文展示了 Open3D 的实用程序,提供了点云可视化、体素下采样和顶点法线估计等任务的 Python 示例。 这些示例突出了 Open3D 在处理和可视化 3D 数据方面的功能。
理解和处理点云对于各种应用程序至关重要,在 3D 计算机视觉的背景下,Open3D 库为这些任务提供了必要的工具。
原文链接:Point Cloud Processing with Open3D and Python
BimAnt翻译整理,转载请标明出处