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

原创 | 文 BFT机器人 

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

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

05

Open3D可视化工具

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

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

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

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

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)

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

StreetVelodyne3DLiDARPOV–模拟1

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

StreetVelodyne3DLiDAR侧视图–模拟2

07

3DLiDAR与2D深度帧的比较

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

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

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

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

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

08

未来的工作和改进

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

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

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

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

你可能感兴趣的:(3d,自动驾驶,人工智能)