使用Open3D实现3D激光雷达可视化:以自动驾驶的2DKITTI深度框架为例(下篇)

原创 | 文 BFT机器人 

【原文链接】使用Open3D实现3D激光雷达可视化:以自动驾驶的2DKITTI深度框架为例(上篇)

图片

05

Open3D可视化工具

  • 多功能且高效的3D数据处理:Open3D是一个全面的开源库,为3D数据处理提供强大的解决方案。它具有优化的后端架构,可实现高效的并行化,非常适合处理复杂的3D几何形状和算法;

  • 逼真的3D场景建模和分析:该库提供了用于场景重建和曲面对齐的专用工具,这些工具是创建精确3D模型的基础。它实现了基于物理的渲染(PBR),确保了这些3D场景的可视化不仅精确,而且非常逼真,大大增强了用户体验和工具在各种专业场景中的适用性;

  • 跨平台兼容性:它支持GCC5.X、XCode10+和VisualStudio2019等各种编译器,确保在Linux、OSX和Windows上无缝运行。它通过conda和pip提供简单的安装过程,方便用户快速轻松地进行设置。

图片

Open3D库的特性和功能

Open3D从头开始开发,专注于精简和有目的的依赖项选择,使其成为3D数据处理中轻量级但功能强大的工具。它的跨平台兼容性是一个关键功能,允许以最小的努力在各种操作系统上进行简单的设置和编译。其代码库的特点是简洁一致的样式透明的代码审查过程,反映了其对高质量软件工程实践的承诺。

Open3D结合了基于物理的渲染(PBR),将3D场景可视化的真实感提升到了一个新的水平,从而增加了可视化的真实感。其全面的3D可视化功能允许对3D数据进行交互式探索,从而增强用户的参与度和理解力。此外,它还包括Python绑定,为脚本编写和快速原型设计提供了用户友好且功能强大的界面,使其成为该领域新手和经验丰富的从业者的理想选择。

该库的实用性和有效性体现在它在众多已发表的研究项目中的使用以及在基于云的应用程序中的积极部署。Open3D鼓励并欢迎全球开源社区的贡献,营造协作和创新的开发环境。这使得Open3D不仅仅是一个用于3D数据处理的工具,更是一个在3D数据分析和可视化领域协同创新的平台。

06

3D点云可视化:代码演练

在本节中,我们将探讨可视化KITTI3DLiDAR传感器扫描数据集所涉及的各种过程,并生成其3D点云表示。您可以通过单击“下载代码”按钮来下载本文中的代码。

加载和读取2D深度图像

此代码片段定义了一个函数“load_depth_image”,该函数用于读取和处理2D深度图像。

#Readthe2DDepthImage

defload_depth_image(file_path):

#Loadthedepthimage

depth_image=plt.imread(file_path)

depth_image_scaling_factor=250.0

#Assumingthedepthimageisnormalized,wemayneedtoscaleittotheactualdistancevalues

#Thisscalingfactorisdataset-specific;you'llneedtoadjustitbasedontheKITTIdatasetdocumentation

depth_image*=depth_image_scaling_factor

returndepth_image

处理多个2D深度帧

此代码片段定义了一个函数“load_and_process_frames”,该函数旨在处理来自指定目录的一系列2D深度图像文件,将它们转换为点云数据。

defload_and_process_frames(directory):

point_clouds=[]

forfilenameinsorted(os.listdir(directory)):

iffilename.endswith('.png'):#CheckforPNGimages

file_path=os.path.join(directory,filename)

depth_image=load_depth_image(file_path)

point_cloud=depth_image_to_point_cloud(depth_image)

point_clouds.append(point_cloud)

returnpoint_clouds

将2D深度帧转换为3DLiDAR点云

“depth_image_to_point_cloud”功能旨在将2D深度图像转换为3D点云。

defdepth_image_to_point_cloud(depth_image,h_fov=(-90,90),v_fov=(-24.9,2.0),d_range=(0,100)):

#Adjustinganglesforbroadcasting

h_angles=np.deg2rad(np.linspace(h_fov[0],h_fov[1],depth_image.shape[1]))

v_angles=np.deg2rad(np.linspace(v_fov[0],v_fov[1],depth_image.shape[0]))

#Reshapinganglesforbroadcasting

h_angles=h_angles[np.newaxis,:]#Shapebecomes(1,1440)

v_angles=v_angles[:,np.newaxis]#Shapebecomes(64,1)

#Calculatex,y,andz

x=depth_image*np.sin(h_angles)*np.cos(v_angles)

y=depth_image*np.cos(h_angles)*np.cos(v_angles)

z=depth_image*np.sin(v_angles)

#Filteroutpointsbeyondthedistancerange

valid_indices=(depth_image>=d_range[0])&(depth_image<=d_range[1])

#Applythemasktoeachcoordinatearray

x=x[valid_indices]

y=y[valid_indices]

z=z[valid_indices]

#Stacktogetthepointcloud

point_cloud=np.stack((x,y,z),axis=-1)

returnpoint_cloud

模拟点云表示

“animate_point_clouds”函数是一个Python例程,旨在使用Open3D库对一系列3D点云进行动画处理。

defanimate_point_clouds(point_clouds):

vis=o3d.visualization.Visualizer()

vis.create_window()

#Setbackgroundcolortoblack

vis.get_render_option().background_color=np.array([0,0,0])

#Initializepointcloudgeometry

point_cloud=o3d.geometry.PointCloud()

point_cloud.points=o3d.utility.Vector3dVector(point_clouds[0])

vis.add_geometry(point_cloud)

frame_index=0

last_update_time=time.time()

update_interval=0.25#Timeinsecondsbetweenframeupdates

whileTrue:

current_time=time.time()

ifcurrent_time-last_update_time>update_interval:

#Updatepointcloudwithnewdata

point_cloud.points=o3d.utility.Vector3dVector(point_clouds[frame_index])

vis.update_geometry(point_cloud)

#Movetothenextframe

frame_index=(frame_index+1)%len(point_clouds)

last_update_time=current_time

vis.poll_events()

vis.update_renderer()

ifnotvis.poll_events():

break

vis.destroy_window()

运行可视化

最后一个代码片段提供了一个工作流,用于使用脚本前面定义的函数将一系列2D深度图像加载、处理和模拟到3D点云中。

#Directorycontainingthedepthimagefiles

directory='archive/2011_09_30_drive_0028_sync/2011_09_30_drive_0028_sync/2011_09_30/2011_09_30_drive_0028_sync/velodyne_points/depth_images'

#Loadandprocesstheframes

point_clouds=load_and_process_frames(directory)

#Simulatethepointclouds

animate_point_clouds(point_clouds)

图片

StreetVelodyne3DLiDARPOV–模拟1

图片

StreetVelodyne3DLiDAR侧视图–模拟2

07

3DLiDAR与2D深度帧的比较

现在让我们比较一下2D深度图和3D点云模拟,这涉及了解它们如何表示空间数据的根本差异。

2D深度图本质上是二维图像,其中每个像素的值表示从传感器到沿直接视线最近的表面点的距离。深度图类似于灰度图像,其中不同的阴影对应于不同的距离。与3D点云相比,通常需要更少的计算能力来处理,它们与标准图像处理技术和算法更兼容。虽然它们提供了有价值的距离信息,但它们可能会丢失有关场景中对象的空间排列和关系的上下文。

相比之下,3D点云是三维坐标系中点的集合。点云中的每个点都代表对象表面的一小部分,从而提供更全面和空间准确的场景表示。处理点云通常需要更多的计算资源。它们需要专门的算法来完成分割、对象识别和3D重建等任务,它们还提供更详细、更准确的空间和物体几何表示,更适合需要高保真空间数据的任务。

图片

输入2D深度图与3D点云模拟的比较

08

未来的工作和改进

可视化技术的潜在改进,特别是在自动驾驶应用的3D点云数据方面,包括旨在提高清晰度准确性用户交互的广泛进步。其中的关键是增强实时处理能力,能够更快、更有效地解释对自动驾驶汽车即时决策至关重要的数据。集成人工智能和机器学习算法可以实现更智能的可视化,促进自动特征检测、异常识别和预测分析。提高点云的分辨率可以捕获更精细的环境细节,这对于精确的物体检测和场景解释至关重要。

色彩映射和纹理技术的进步可以提供更逼真、信息更丰富的可视化效果,尤其是在将LiDAR数据与相机图像集成以创建纹理丰富的3D模型时。开发交互式可视化工具将使用户能够更直观地探索和分析3D点云数据,从而增强那些没有专业知识的人的可用性。增强现实和虚拟现实技术的结合可以提供身临其境的3D环境,从而更直观地理解复杂的数据集。

除此之外,实施先进的降噪和数据过滤技术对于提高可视化的清晰度至关重要,有助于准确解释复杂场景。解决可扩展性和大数据管理问题将能够在不影响性能的情况下处理大量数据集,这对于分析广阔的区域或延长的时间范围至关重要。可定制的可视化选项,满足各种用户需求和偏好,包括可调整的视点和渲染样式,将增强这些工具的实用性和可访问性。最后,确保这些可视化工具可以在包括移动设备在内的不同平台上访问,并且对广泛的用户群友好,这将大大扩大其适用性和影响。

若您对该文章内容有任何疑问,请与我们联系,我们将及时回应。

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

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

相关文章

原生JavaScript实现 元素全屏与退出全屏效果

之前写过 前端screenfull实现界面全屏展示功能 突然发现自己犯傻了 其实元素js中就有全屏与取消全屏的方式 html代码如下 <!DOCTYPE html> <html> <head><title>全屏实验</title><style></style> </head> <body><d…

Python简介:一种强大的编程语言

Python是一种高级、通用的编程语言&#xff0c;以其简洁易读的语法和强大的功能而闻名。它广泛应用于各种领域&#xff0c;包括软件开发、数据分析、人工智能等。本文将详细介绍Python的特点、应用领域以及如何开始学习Python。 &#xfeff; &#xfeff;一、Python的特点 1…

【Java】spring

一、spring spring是一个很大的生态圈&#xff0c;里面有很多技术。 其中最基础的是spring framework&#xff0c;主要的技术 是springboot以及springcloud。 1、spring framework spring framework是spring生态圈中最基础的项目&#xff0c;是其他项目的基础。 1.1、核心…

【网络安全】学习Web安全必须知道的一本书

【文末送书】今天推荐一本网络安全领域优质书籍。 目录 正文实战案例1&#xff1a;使用Docker搭建LAMP环境实战案例2&#xff1a;使用Docker搭建LAMP环境文末送书 正文 学习Web安全离不开Web&#xff0c;那么&#xff0c;需要先来学习网站的搭建。搭建网站是每一个Web安全学习…

推荐一个vscode看着比较舒服的主题:Dark High Contrast

主题名称&#xff1a;Dark High Contrast &#xff08;意思就是&#xff0c;黑色的&#xff0c;高反差的&#xff09; 步骤&#xff1a;设置→Themes→Color Theme→Dark High Contrast 效果如下&#xff1a; 感觉这个颜色的看起来比较舒服。

音箱芯片系统案例分析

近年来&#xff0c;音箱市场需求日益增长&#xff0c;其轻便、时尚的外观和无线连接的便捷性深受消费者喜爱。音箱的电路图主要由以下几个部分组成&#xff1a;音频功放芯片 前置信号处理 运算放大器 稳压电源芯片 电平指示 音频功放芯片&#xff1a;D2668,D2025,D8227,D4520…

分享一套国内功能齐全的开源MES/免费MES/MES源代码

一、系统概述&#xff1a; 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、适合二开的开源MES、好看的数字大屏。 1.万界星空开源MES制造执行系统的Java开源版本。 开源mes系统包括系统管理&#xff0c;车间基础数据管理&#xff0c;计划管理…

WPS 删除设备提示:请先清空设备内的文件

一、问题描述 WPS 删除设备提示&#xff1a;请先清空设备内的文件&#xff0c;如下如&#xff1a; 二、原因方案 字面意思&#xff0c;有文件就不能删除。 应该是以设备为标识符来划分不同文件的&#xff0c;所以&#xff0c;只要右键点击【打开】就会显示文件&#xff0c;把…

力扣每日一题day37[113.路径总和ii]

给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…

Linux--Shell脚本应用实战

实验环境 随着业务的不断发展&#xff0c;某公司所使用的Linux服务器也越来越多。在系统管理和维护过程中&#xff0c;经 常需要编写一些实用的小脚本&#xff0c;以辅助运维工作&#xff0c;提高工作效率。 需求描述 > 编写一个名为getarp.sh的小脚本&#xff0c;记录局域…

JavaWeb笔记之JSP

一、引言 现有问题 在之前学习Servlet时&#xff0c;服务端通过Servlet响应客户端页面&#xff0c;有什么不足之处&#xff1f; 开发方式麻烦&#xff1a;继承父类、覆盖方法、配置Web.xml或注解。 代码修改麻烦&#xff1a;重新编译、部署、重启服务。 显示方式麻烦&#x…

Deployment Controller详解(上)

上一篇在《Kubectl 部署无状态应用》中介绍了如何使用 Deployment 部署五个 hello world 实例时&#xff0c;我们并没有详细探讨 Deployment Controller 的各项功能。因此&#xff0c;本文将深入介绍 Deployment Controller 的作用以及它能够完成的任务。 本文来自官方文档梳理…

Springboot是什么?Springboot详解!入门介绍

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

数据库编程大赛:一条SQL计算扑克牌24点

你是否在寻找一个平台&#xff0c;能让你展示你的SQL技能&#xff0c;与同行们一较高下&#xff1f;你是否渴望在实战中提升你的SQL水平&#xff0c;开阔你的技术视野&#xff1f;如果你对这些都感兴趣&#xff0c;那么本次由NineData主办的《数据库编程大赛》&#xff0c;将是…

pg自定义函数动态生成表名

目录 一、需求 二、踩坑记录 三、解决方案 一、需求 想在postgres数据库中动态查询【table_2023、table_2024...】这种格式表的数据。 例如&#xff1a; 今天是2023-12-22号&#xff0c;查询语句为select * from table_2023; 今天是2024-12-22号&#xff0c;查询语句为sele…

Navicat里MySQL表的创建(详细)

我以Navicat连接MySQL为例&#xff0c;演示表的创建方法。 前提 创建表的语法&#xff1a; create table 表名 &#xff08; 字段名1&#xff0c;字段类型&#xff0c; 字段名2&#xff0c;字段类型&#xff0c; ...... 字段名n&#xff0c;字段类型 ); 我计划在test库存放一…

【c】无限制输入字符

我们做题有时候会碰上这种的输入&#xff0c;一直输入字符&#xff0c; 下面附上两种解决办法 方法1&#xff1a; char s[10000]; int i0; int arr[1000]{0}; while(scanf("%c",&s[i])!EOF) { i; } 这样你就可以一直输入&#xff0…

深信服AF防火墙升级步骤(简单粗暴)

设备当前版本&#xff1a;AF8.0.75 升级升级后版本&#xff1a;AF8.0.85 官方发行&#xff1a;内容比较多&#xff0c;找设备当前版本在不在支持升级的列表即可 8.0.75是可以直接升到8.0.85的 升级前注意事项&#xff1a; 升级是需要重启设备的&#xff0c;会断网&#xff…

FreeRTOS之队列集操作(实践)

多个任务在在同一队列中传递的同一种数据类型&#xff0c;而队列集能够在任务之间传递不同的数据类型。 配置流程&#xff1a;&#xff08;更详细流程参考正点原子的教程&#xff09; 1、启用队列集将configUSE_QUEUE_SETA置1&#xff09; 2、创建队列集 3、创建队列或信号…

Java中的Stream流收集器

目录 1、归约和汇总 2、分组 3、分区 4、理解收集器接口 Java 中 Stream 流用来帮助处理集合&#xff0c;类似于数据库中的操作。 在 Stream 接口中&#xff0c;有一个抽象方法 collect&#xff0c;你会发现 collect 是一个归约操作&#xff08;高级规约&#xff09;&#…