【转载翻译】使用Open3D和Python进行点云处理

news2025/4/15 0:30:29

转自个人博客:【转载翻译】使用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,p2pn},其中每个 p i ∈ R 3 p_i \in \mathbb{R}^3 piR3表示三维空间中的一个点,坐标对应于它的位置。

这种简单性允许从环境中直接获取空间数据,使点云成为计算机视觉、计算机图形学和机器人技术等领域不可或缺的工具。经济实惠的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。设置zoomfrontlookatup等参数来配置视角和位置,从而提供下采样点云的清晰可视化。

顶点法线估计

顶点法线估计计算云中每个点的法线,这对于许多 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库为这些任务提供了必要的工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用户登录不上linux服务器

一般出现这种问题,重新用root用户修改lsy用户的密码即可登录,但是当修改了还是登录不了的时候,去修改一个文件用root才能修改, 然后在最后添加上改用户的名字,例如 原本是只有user的,现在我加上了lsy了&a…

matplotlib数据展示

目录 一、绘制直方图 1、简单直方图 2、绘制横向直方图 3、绘制堆叠直方图 4、对比直方图 二、折线图与散点图 三、绘制饼图 四、雷达图 1、简单雷达图 2、多层雷达图 五、总和 在前面的学习中,我们能够使用一些库进行数据的整合,收集&#x…

MySQL 面经

1、什么是 MySQL? MySQL 是一个开源的关系型数据库,现在隶属于 Oracle 公司。是我们国内使用频率最高的一种数据库,我本地安装的是比较新的 8.0 版本。 1.1 怎么删除/创建一张表? 可以使用 DROP TABLE 来删除表,使用…

贪心算法 day08(加油站+单调递增的数字+坏了的计算机)

目录 1.加油站 2.单调递增的数字 3.坏了的计算器 1.加油站 链接:. - 力扣(LeetCode) 思路: gas[index] - cost[index],ret 表示的是在i位置开始循环时剩余的油量 a到达的最大路径假设是f那么我们可以得出 a b …

String类基本使用

文章目录 1. String类的理解和创建对象2. 创建String对象的两种方式3. 两种创建String对象的区别4. 测试5. 字符串的特性6. String 类的常见方法 1. String类的理解和创建对象 String 对象用于保存字符串,也就是一组字符序列字符串常量对象是用双引号括起的字符序列…

华为机试—火车进站

题目 火车站一共有 n 辆火车需要入站,每辆火车有一个编号,编号为 1 到 n。 同时,也有火车需要出站,由于火车站进出共享一个轨道,所以后入站的火车需要先出站。换句话说,对于某一辆火车,只有在它…

Python数组(array)学习之旅:数据结构的奇妙冒险

Python数组学习之旅:数据结构的奇妙冒险 第一天:初识数组的惊喜 阳光透过窗帘缝隙洒进李明的房间,照亮了他桌上摊开的笔记本和笔记本电脑。作为一名刚刚转行的金融分析师,李明已经坚持学习Python编程一个月了。他的眼睛因为昨晚熬夜编程而微微发红,但脸上却挂着期待的微…

spark-core编程2

Key-Value类型: foldByKey 当分区内计算规则和分区间计算规则相同时,aggregateByKey 就可以简化为 foldByKey combineByKey 最通用的对 key-value 型 rdd 进行聚集操作的聚集函数(aggregation function)。类似于aggregate()&…

AIDD-人工智能药物设计-大语言模型在医学领域的革命性应用

Nat. Rev. Bioeng. | 大语言模型在医学领域的革命性应用 大型语言模型(LLMs),如 ChatGPT,因其对人类语言的理解与生成能力而备受关注。尽管越来越多研究探索其在临床诊断辅助、医学教育等任务中的应用,但关于其发展、…

Windows 系统中安装 Git 并配置 GitHub 账户

由于电脑重装系统,重新配置了git. 以下是在 Windows 系统中安装 Git 并配置 GitHub 账户的详细步骤: 1. 安装 Git 访问 Git 官网下载页面下载 Windows 版本的 Git 安装程序运行安装程序,使用默认选项即可 2. 配置 Git 用户信息 打开命令…

QQ风格客服聊天窗口

QQ风格客服聊天窗口 展示引入方式 展示 引入方式 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…

MCU刷写——Hex文件格式详解及Python代码

工作之余来写写关于MCU的Bootloader刷写的相关知识,以免忘记。今天就来聊聊Hex这种文件的格式,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢…

汇舟问卷:国外问卷调查技巧有哪些,具体该怎么操作

大家好&#xff0c;我是汇舟问卷&#xff0c;今天咱们就聊聊国外问卷答题的技巧和操作步骤&#xff0c;保你听完立马能上手&#xff01; 一、答题前先创建人设 1&#xff0c;进题时先瞄两眼问题&#xff0c;快速判断问卷主题&#xff0c;再定人设。比如遇到奶粉问卷&#xff…

C++标识符:检查是否和保留字冲突

1. 基础知识 最基本的要求&#xff1a; 字母、数字、下划线组成&#xff0c; 并且不能是数字开头。 禁忌1&#xff1a; C 关键字不能用做标识符。 它们是&#xff1a; alignas alignof asm auto bool break case catch char char16_t char32_t class const constexpr const_…

《Python星球日记》第27天:Seaborn 可视化

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏&#xff1a;《Python星球日记》&#xff0c;限时特价订阅中ing 目录 一、Seabor…

自动驾驶技术-相机_IMU时空标定

自动驾驶技术-相机_IMU时空标定 时间延迟 时间延迟 参考链接1、2 相机主要分为全局和卷帘快门相机&#xff0c;从触发到成像的过程包括&#xff1a;复位时间、AE()曝光时间、读出时间 全局快门如下图所示 卷帘快门如下图所示 相机录制视频时&#xff0c;为了保持固定频率&am…

”插入排序“”选择排序“

文章目录 插入排序1. 直接插入排序(O(n^2))举例1&#xff1a;举例2&#xff1a;直插排序的"代码"直插排序的“时间复杂度” 2. 希尔排序(O(n^1.3))方法一方法二(时间复杂度更优) 选择排序堆排序直接选择排序 我们学过冒泡排序&#xff0c;堆排序等等。&#xff08;回…

Python深度学习基础——卷积神经网络(CNN)(PyTorch)

CNN原理 从DNN到CNN 卷积层与汇聚 深度神经网络DNN中&#xff0c;相邻层的所有神经元之间都有连接&#xff0c;这叫全连接&#xff1b;卷积神经网络 CNN 中&#xff0c;新增了卷积层&#xff08;Convolution&#xff09;与汇聚&#xff08;Pooling&#xff09;。DNN 的全连接…

MTK7628基于原厂的mtk-openwrt-sdk-20160324-8f8e4f1e.tar.bz2 源代码包,配置成单网口模式的方法

一、配置. 在SDK工程下&#xff0c;运行make kernel_menuconfig&#xff0c;如下图所示&#xff1a; Ralink Module --->选上“One Port Only”&#xff0c;如下图所示&#xff1a; 如果P0网口实现WAN口&#xff0c;就配置成W/LLLL,否则就配置成LLLL/W. 二、修改网口的原代…

艾伦·图灵:计算机科学与人工智能之父

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 艾伦图灵&#xff1a;计算机科学与人工智能之父 一、天才的诞生与早期生涯 1912年6月…