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

一、说明

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

  • 第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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手机python怎么用海龟画图,python怎么在手机上编程

大家好,给大家分享一下手机python怎么用海龟画图,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 1、如何python手机版创造Al? 如果您想在手机上使用Python来创建AI(人工智能)程序&#xff0…

Windows Server 2012 能使用的playwright版本

由于在harkua_bot里面使用到了playwright,我的服务器又是Windows Server 2012 R2,最新版playwright不支持Windows Server 2012 R2,支持Windows Server 2016以上,所以有了这个需求 https://cdn.npmmirror.com/binaries/playwright…

网络安全系统中的守护者:如何借助威胁情报 (TI) 提高安全性

在这篇哈巴尔网站上的推文中,我们将解释 TI 缩写背后的含义、为什么需要它、Positive Technologies 收集哪些网络威胁数据以及如何帮助企业预防网络威胁。我们将以四种情况为例,说明公司如何使用 PT Threat Intelligence Feeds 来发现恶意活动并预防攻击…

链表的算法

每日一句:二十岁的年纪,为什么不敢去折腾?哪怕最后失败,你也还有从头再来的资本。 正如乔布斯所说:你本就一无所有,没有理由不去追随你的内心。 目录 哈希表的简单介绍 有序表的简单介绍 有序表的固定操…

Unity 性能优化四:UI耗时函数、资源加载、卸载API

UI耗时函数 1.1 Canvas.SendWillRenderCanvases 这个函数是由于自身UI的更新,产生的耗时 1. 这里更新的是vertex 属性,比如 color、tangent、position、uv,修改recttransform的position、scale,rotation并不会导致顶点属性改变…

100个网络安全测试面试题

1、Burpsuite常用的功能是什么? 2、reverse_tcp和bind_tcp的区别? 3、拿到一个待检测的站或给你一个网站,你觉得应该先做什么? 4、你在渗透测试过程中是如何敏感信息收集的? 5、你平时去哪些网站进行学习、挖漏洞提交到…

uni-app云打包(android)(自有证书、云端证书、公共测试证书)

一、进入云打包入口 发行->原生App-云打包 二、证书选择 1、使用自有证书 ①进入香蕉云编(这里采用的证书从香蕉云编进行生成) 香蕉云编-app打包上架工具类平台 ②进入页面选择“生成签名证书”->"立即创建证书" ③选择“安卓证书生…

java商城系统和php商城系统有什么差异?如何选择?

java商城系统和php商城系统是两种常见的电子商务平台,它们都具有一定的优势和劣势。那么,java商城系统和php商城系统又有哪些差异呢? 一、开发难度 Java商城系统和PHP商城系统在开发难度方面存在一定的差异。Java商城系统需要使用Java语言进…

微服务模式:业务服务模式

无论是单体应用还是微服务,构建企业应用的业务逻辑/服务在更多方面上都有相似之处而不是差异。在两种方法中,都包含服务、实体、仓库等类。然而,也会发现一些明显的区别。在本文中,我将试图以概念性的方式强调这些区别&#xff0c…

opencv-24 图像几何变换03-仿射-cv2.warpAffine()

什么是仿射? 仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。该变换能够 保持图像的平直性和平行性。平直性是指图像经过仿射变换后,直线仍然是直线;平行性是指 图像在完成仿射变换后,平行线仍然是平行线。…

深入解析Linux进程内存:VSS、RSS、PSS、USS及查看方式

VSS 虚拟耗用内存大小,是进程可以访问的所有虚拟内存的总量,包括进程独自占用的物理内存、和其他进程共享的内存、分配但未使用的内存。 RSS 驻留内存大小,是进程当前实际占用的物理内存大小,包括进程独自占用的物理内存、和其…

C#实现滑动拼图验证码

开发环境:C#,VS2019,.NET Core 3.1,ASP.NET Core 1、建立一个验证码控制器 新建两个方法Create和Check,Create用于创建验证码(返回2张图片和令牌),Check用于验证(验证图…

【iOS】KVC KVO 总结

文章目录 KVC1. KVC赋值原理 setValue:forKey:2. KVC取值原理 valueForKey:3. 注意4. KVC的批量存值和取值 KVO 使用1. KVO的介绍2. KVO监听的步骤注册监听监听实现移除监听例子 3. KVO的传值4. KVO注意5. KVO的使用场景 KVO原理1. KVO的本质是改变了setter方法的调用2. _NSSet…

Glow: Generative Flow with Invertible 1×1 Convolutions论文解析及实现(二)

Glow: Generative Flow with Invertible 11 Convolutions 代码github: https://github.com/rosinality/glow-pytorch添加链接描述 1 模型架构如下 1.1 左边图flow模型 Flow model ① ActNorm ② InvConv2dLU ③ AffineCoupling 1.2 右边模型结构Glow模型 Glow Model Block…

【Linux】-进程概念及进程状态(僵尸进程和孤儿进程)

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

更安全,更省心丨DolphinDB 数据库权限管理系统使用指南

在数据库产品使用过程中,为保证数据不被窃取、不遭破坏,我们需要通过用户权限来限制用户对数据库、数据表、视图等功能的操作范围,以保证数据库安全性。为此,DolphinDB 提供了具备以下主要功能的权限管理系统: 提供用户…

OpenMP

官方文档:OpenMP | LLNL HPC Tutorials OpenMP总览 统一内存访问:OpenMP、Pthreads 非统一内存访问:MPI OpenMP与Pthread OpenMP原理 串行区到达并行区后会派生多个线程,并行区代码执行完后进行线程合并,剩下主线程 编…

Linux - PostgreSQL 适用于9.x 以上的 tar.gz 源码安装与理解 - 报错集锦

这里写目录标题 序言主要内容bash 配置文件个人理解关于初始化 PostgreSQL 数据库的理解 启动方法检查服务器是否在PostgreSQL中运行关闭 postgresql 数据库方法参考链接 序言 PostgreSQL 9.x 以下版本笔者没用过,具体操作看参考链接,笔者就不记录重复操…

MODBUS-TCP转Ethernet IP 网关连接空压机 配置案例

本案例是工业现场应用捷米特JM-EIP-TCP的Ethernet/IP转Modbus-TCP网关连接欧姆龙PLC与空压机的配置案例。使用设备:欧姆龙PLC,捷米特JM-EIP-TCP网关, ETHERNET/IP 的电气连接 ETHERNET/IP 采用标准的 T568B 接法,支持直连和交叉接…

在centos 7系统docker上构建mysql 5.7

一、VM上已经安装centos 7.9,且已完成docker的构建 二、安装mysql5.7 安装镜像:[rootlocalhost lll]# docker pull mysql:5.7 查看镜像[rootlocalhost lll]# docker images 根据镜像id构建mysql容器,且分配端口号[rootlocalhost lll]# dock…