【点云处理教程】01如何创建和可视化点云

news2024/9/23 9:27:19

一、说明

        本文是系列教程,专门介绍点云处理的全流程,是一个入门工具。“点云处理”教程对初学者友好,我们将在其中简单地介绍从数据准备到数据分割和分类的点云处理管道。

  • 第1条:点云处理简介
  • 文章2:在Python中从深度图像估计点云
  • 文章3:了解点云:使用Python实现地面检测
  • 文章4:Python中的点云过滤
  • 文章 5 : Python 中的点云分割

二、 简介

        点云应用无处不在:机器人、自动驾驶汽车、辅助系统、医疗保健等。点云是一种适合处理真实世界数据的 3D 表示,尤其是当需要场景/对象的几何形状时,例如物体的距离、形状和大小。

        点云是一组表示现实世界中的场景或空间中的对象的点。它是几何对象和场景的离散表示。更正式地说,点云PCD是一组n个点,其中每个点Pi由其3D坐标表示:

        请注意,可以添加一些其他功能来描述点云,例如 RGB 颜色、法线等。例如,可以添加 RGB 颜色以提供颜色信息。

三. 点云生成

        点云通常使用3D扫描仪(激光扫描仪,飞行时间扫描仪和结构光扫描仪)或计算机辅助设计(CAD)模型生成。在本教程中,我们将首先创建随机点云并可视化它们。然后,我们将通过使用 Open3D 库从 3D 表面采样点,从 3D 模型生成它。最后,我们将看到如何从 RGB-D 数据创建它们。

让我们从导入库开始:

import numpy as np
import matplotlib.pyplot as plt
import open3d as o3d

3.1 随机点云

        最简单的方法是随机创建点云。请注意,我们通常不会创建要处理的随机点,例如为 GAN(生成对抗网络)创建噪声。

        通常,点云由(n × 3)数组表示,其中n是点数。让我们创建一个包含 5 个随机点的点云:

number_points = 5
pcd = np.random.rand(number_points, 3)  # uniform distribution over [0, 1)
print(pcd)

        我们可以只打印这些点,但它效率不高,特别是如果点的数量像大多数应用程序一样很大。更好的方法是在 3D 空间中显示它们。让我们使用 Matplotlib 库来可视化它:

# Create Figure:
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.scatter3D(pcd[:, 0], pcd[:, 1], pcd[:, 2])
# label the axes
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")
ax.set_title("Random Point Cloud")
# display:
plt.show()

随机点云可视化

3.2 采样点云

有时直接处理 3D 模型需要时间和内存。因此,从其3D表面对点云进行采样是一种潜在的解决方案。让我们从 Open3D 数据集导入兔子模型:

bunny = o3d.data.BunnyMesh()
mesh = o3d.io.read_triangle_mesh(bunny.path)

或者从以下链接下载后导入它:

mesh = o3d.io.read_triangle_mesh("data/bunny.ply")

接下来,显示 3D 模型以查看其外观。您可以移动鼠标从不同的视点进行查看。

# Visualize:
mesh.compute_vertex_normals() # compute normals for vertices or faces
o3d.visualization.draw_geometries([mesh])
兔子3D模型

        要对点云进行采样,有几种方法。在此示例中,我们从导入的网格中均匀采样 1000 个点并将其可视化:

# Sample 1000 points:
pcd = mesh.sample_points_uniformly(number_of_points=1000)

# visualize:
o3d.visualization.draw_geometries([pcd])

         兔子点云

我们可以将创建的点云保存为 .ply 格式,如下所示:

# Save into ply file:
o3d.io.write_point_cloud("output/bunny_pcd.ply", pcd)

3.3 来自RGB-D数据的点云

        RGB-D 数据是使用 RGB-D 传感器(如 Microsoft Kinect)收集的,这些传感器同时提供 RGB 图像和深度图像。RGB-D传感器涉及许多应用,例如室内导航,避障等。由于RGB图像提供像素颜色,因此深度图像的每个像素都指示其与相机的距离。

        Open3D 提供了一组用于 RGB-D 图像处理的功能。要使用Open3D函数从RGB-D数据创建点云,只需导入两个图像,创建一个RGB-D图像对象,最后计算点云,如下所示:

# read the color and the depth image:
color_raw = o3d.io.read_image("../data/rgb.jpg")
depth_raw = o3d.io.read_image("../data/depth.png")

# create an rgbd image object:
rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(
    color_raw, depth_raw, convert_rgb_to_intensity=False)
# use the rgbd image to create point cloud:
pcd = o3d.geometry.PointCloud.create_from_rgbd_image(
    rgbd_image,
    o3d.camera.PinholeCameraIntrinsic(
        o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault))

# visualize:
o3d.visualization.draw_geometries([pcd])

                                                        从RGB-D图像生成的彩色点云

四. Open3D 和 NumPy

        有时您需要在Open3D和NumPy表示之间切换。例如,假设我们想将 NumPy 点云转换为对象以进行可视化,并使用 Matplotlib 可视化兔子的 3D 模型。Open3D.PointCloud

4.1 从NumPy到Open3D

在此示例中,我们使用函数创建 2000 个随机点,该函数从 上的均匀分布创建随机样本。然后我们创建一个对象,并使用函数将其特征设置为随机点。NumPy.random.rand()[0,1[Open3D.PointCloudOpen3D.PointCloud.pointsOpen3D.utility.Vector3dVector()

# Create numpy pointcloud:
number_points = 2000
pcd_np = np.random.rand(number_points, 3)

# Convert to Open3D.PointCLoud:
pcd_o3d = o3d.geometry.PointCloud()  # create point cloud object
pcd_o3d.points = o3d.utility.Vector3dVector(pcd_np)  # set pcd_np as the point cloud points

# Visualize:
o3d.visualization.draw_geometries([pcd_o3d])

                                                随机点云的 Open3D 可视化

4.2 从Open3D到NumPy。

        在这里,我们首先使用返回对象的函数从 .ply 文件中读取点云。之后,我们只需要使用函数将表示点的特征转换为 NumPy 数组。最后,我们像上面一样显示获得的数组。Open3D.io.read_point_cloud()Open3D.PointCloudOpen3D.PointCloud.pointsNumPy.asarray()

# Read the bunny point cloud file:
pcd_o3d = o3d.io.read_point_cloud("../data/bunny_pcd.ply")

# Convert the open3d object to numpy:
pcd_np = np.asarray(pcd_o3d.points)

# Display using matplotlib:
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.scatter3D(pcd_np[:, 0], pcd_np[:, 2], pcd_np[:, 1])
# label the axes
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")
ax.set_title("Bunny Point Cloud")
# display:
plt.show()

                                                使用 Matplotlib 显示的兔子点云

五. 结论

        在本教程中,我们学习了如何创建和可视化点云。在接下来的教程中,我们将学习如何处理它们。在下一教程中,我们将了解如何在不使用 Open3D 函数的情况下从深度图像和 RGB-D 数据详细计算点云。

参考来源:

Introduction to Point Cloud Processing | by Chayma Zatout | Better Programming

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

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

相关文章

Python入门【可变参数、lambda表达式和匿名函数、eval()函数、递归函数、嵌套函数(内部函数)、 nonlocal关键字】(十二)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误…

怎么对XMind思维导图加密?

在现代社会中,信息安全变得越来越重要。对于那些使用XMind思维导图来组织和管理重要信息的人来说,保护思维导图中的内容免受未经授权的访问变得至关重要。本文将介绍如何加密XMind思维导图,以确保您的信息安全。 什么是XMind思维导图&#x…

Qt中postevent造成内存泄漏问题的通用解决方案

在Qt中由QCoreApplication统一管理Qt事件的收发和销毁,其中sendEvent为阻塞式发送,用于单线程的事件发送;postevent为非阻塞式发送,构造事件的线程和接受事件的线程可以为两个线程。 最近在做一个个人项目ShaderLab 需要绘制OpenGL实时渲染的图像,由于OpenGL渲染基本都放…

Flowable-服务-消息任务

文章目录 定义图形标记XML内容集成Rabbitmq引入pom包配置rabbitmq 操作界面 定义 Mq 任务不是 BPMN 2.0 规范定义的官方任务,在 Flowable 中,Mq 任务是作为一种特殊的服务 任务来实现的,主要做Mq消息发送。 图形标记 由于 Mq 任务不是 BPM…

openGauss学习笔记-25 openGauss 聚集函数

文章目录 openGauss学习笔记-25 openGauss 聚集函数25.1 sum(expression)25.2 max(expression)25.3 min(expression)25.4 avg(expression)25.5 count(expression)25.6 count(*)25.7 delta25.8 mode() within group (order by value anyelement) openGauss学习笔记-25 openGauss…

Vue『卡片拖拽式课程表』

Vue『卡片拖拽式课程表』 概述 在本篇技术博客中,我们将介绍一个使用Vue实现的『卡片拖拽式课程表』。这个课程表允许用户通过拖拽课程卡片来安排不同的课程在时间表上的位置。我们将逐步讲解代码实现,包括课程表的布局、拖拽功能的实现,以…

mac使用brew切换node的版本号

借用的是这篇文章 》 mac 使用brew切换node版本 # 查看node的版本号 brew search node# 安装其他版本. 选择 node16版本 brew install node16# 如果你是第一次安装node的话,执行下面这个操作 brew link --overwrite --force node16# 如果你是第二次安装node的话&am…

一文教会你单向链表

目录 一、什么是链表? 1.链表的定义 2.链表的实现 2.1链表的定义 2.2创建一个链表 二、链表的各个接口 1.创建节点 2.头插(将新创建的节点作为头插入到链表中) 3.打印链表 4.尾插(将新创建的节点插入到链表的末端) 5.头删 6.尾删 7.查找 8.删除指定节点位…

C语言基础入门详解三

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 一、C语言之函数指针 #include<stdio.h> #include<stdlib.h> /**函数指针 …

基于BIM+AI的建筑能源优化模型【神经网络】

推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 AEC&#xff08;建筑、工程、施工&#xff09;行业的BIM 技术&#xff0c;允许在实际施工开始之前虚拟地建造建筑物&#xff1b; 这带来了许多有形和无形的好处&#xff1a;减少成本超支、更有效的协调、增强决策权等等。…

实例026 随机更换主界面背景

实例说明 如果开发的软件用户使用频率非常高&#xff0c;可以为程序设计随机更换背景的程序。这样不但可以使用户心情愉快&#xff0c;也增加了软件的人性化设计。下面的界面就是一个随机更换主界面的例子&#xff0c;效果如图1.26所示。 技术要点 随机更换主界面背景使用了…

MySql002——关系型数据库基础知识

前言&#xff1a;因为本专栏学习的是MySQL&#xff0c;而MySQL是关系型数据库&#xff0c;所以这篇文章就来介绍一些关系型数据库基础知识&#xff0c;至于其他知识小伙伴们可以自行学习&#xff0c;同时不足之处也欢迎批评指正&#xff0c;谢谢~ 一、MySQL关系型数据库(RDBMS)…

Flowable-服务-Http任务

目录 定义图形标记XML内容界面操作 定义 Http 任务不是 BPMN 2.0 规范定义的官方任务&#xff0c;在 Flowable 中&#xff0c;Http 任务是作为一种特殊的服务 任务来实现的&#xff0c;主要调用Http服务使用。 图形标记 由于 Http 任务不是 BPMN 2.0 规范的“官方”任务&…

05-向量的意义_n维欧式空间

线性代数 向量与其运算 向量是线性代数里面最基本的概念&#xff0c;它其实就是一维数组&#xff0c;由 N 个数构成的&#xff0c; X(X1, X2…Xn) 向量的维度可以是任意正整数&#xff0c;可以表示在 n 维空间中的位置或方向。向量本身是一维的&#xff0c; 但向量所处的空间…

JavaWeb+jsp+Tomcat的网上订餐项目

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88130029?spm1001.2014.3001.5503 技术&#xff1a;ssm jsp JDK1.8 MySQL5.7 Tomcat7.0.5 功能&#xff1a;普通用户与管理员两个登录&#xff0c;管理员可以进行商品的增删改&#xff0c;…

JAVA SE -- 第十二天

&#xff08;全部来自“韩顺平教育”&#xff09; 常用类 一、包装类 1、包装类的分类 ①针对八种基本数据类型相应的引用类型--包装类 ②有了类的特点&#xff0c;就可以调用类中的方法 ③ 基本数据类型包装类booleanBooleancharCharacterbyteByteshortShortintInteger…

基于STM32设计的人体健康检测仪

一、项目介绍 当前文章介绍基于STM32设计的人体健康检测仪。设备采用STM32系列MCU作为主控芯片&#xff0c;配备血氧浓度传感器&#xff08;使用MAX30102血氧浓度检测传感器&#xff09;、OLED屏幕和电池供电等外设模块。设备可以广泛应用于医疗、健康等领域。可以帮助医生和病…

Spring源码(三)Spring Bean生命周期

Bean的生命周期就是指&#xff1a;在Spring中&#xff0c;一个Bean是如何生成的&#xff0c;如何销毁的 Bean生命周期流程图 1、生成BeanDefinition Spring启动的时候会进行扫描&#xff0c;会先调用org.springframework.context.annotation.ClassPathScanningCandidateCompo…

【C++入门到精通】C++入门 —— 类和对象(了解类和对象)

目录 一、类和对象的历史由来 二、面向过程和面向对象的初步认识 三、类 1.引子 2.类的定义 3.类的访问限定符及封装 ⭕访问限定符 &#x1f6a9;访问限定符解释说明 &#x1f6a9;struct 与 class 的区别 1. 默认访问级别&#xff1a; 2. 继承权限&#xff08;默认的…

安全基础 --- html标签 + 编码

html标签 &#xff08;1&#xff09;detail标签 <details>标签用来折叠内容&#xff0c;浏览器会折叠显示该标签的内容。 <1> 含义&#xff1a; <details> 这是一段解释文本。 </details> 用户点击这段文本&#xff0c;折叠的文本就会展开&#x…