目录

  • 3D基础
    • 注意事项
    • 一、2023/5/11更新
    • 二、2023/5/15更新
    • 前言
    • 1. nuScenes数据集
    • 2. nuScenes数据格式
    • 3. 点云可视化
    • 4. 点云可视化工具
    • 5. 点云可视化(补充)
    • 总结

3D基础

注意事项

一、2023/5/11更新

新增工具可视化点云,即第 4 节内容

二、2023/5/15更新

经杜老师指正,之前实现的 3D 可视化的效果并不是不好,而是输入数据存在问题!!!这边看了下,利用 mayavi.malb 库重新来可视化点云数据,新增第 5 小节内容

前言

手写 AI 推出的全新保姆级从零手写自动驾驶 CV 课程,链接。记录下个人学习笔记,仅供自己参考。

本次课程主要学习点云数据的可视化。

课程大纲可看下面的思维导图。

1. nuScenes数据集

nuScenes 数据集是一种用于自动驾驶研究的大规模开放式数据集,其中包含了从多个传感器收集的高清三维激光雷达数据、高清摄像头数据、GPS 和 IMU 数据以及其它传感器等多种数据类型,总数据量达到了超过 1000 小时的行驶数据。各个传感器在车辆的具体位置可参考 图1-1(from chatGPT)

nuScenes 数据集由 nuTonomy 公司于 2019 年发布,后被 Aptiv 收购并维护。数据集中包含了超过 1000 个行驶场景,每个场景长度约为 20 秒,包括了各种驾驶情况,如城市、高速公路和居住区等场景

nuScenes 数据集中的传感器数据可以用于多种自动驾驶研究任务,如目标检测、语义分割、行为预测等。

关于 nuScenes 数据集更多的描述可见官网

nuScenes 官网:https://www.nuscenes.org/nuscenes?sceneId=scene-0100&frame=0&view=lidar

nuScenes 教程:https://www.nuscenes.org/nuimages#tutorial

nuScenes mini 数据集下载网盘链接:https://pan.baidu.com/s/1BNuDTDCN37rkWRYBdF8C7Q?pwd=yolo

图1-1 车辆传感器位置

2. nuScenes数据格式

本次我们使用 v1.0-mini 数据集来进行后续的学习工作,它是 nuScenes 数据集的一个子集,解压后包含以下五个文件:

1.maps

  • 包含有关城市街道的地图数据,包括道路、车道、交叉口、建筑物和树木等信息

2.samples

  • 包含有关车辆传感器数据的信息,如激光雷达、相机和毫米波雷达等一些样本数据
  • 相机数据是以图片的格式存储的,LiDAR 数据是以二进制的格式存储的,Radar 数据则是以 PCD 的格式进行存储的
  • PCD 全称 Point Cloud Data,是一种用于存储三维点云数据的文件格式。每个 .pcd 文件包含了 x、y、z 的三维坐标以及反射强度等信息
  • 后续点云数据的可视化是读取的 LiDAR_TOP 中的某一个二进制文件

3.sweeps

  • 包含了一系列车辆传感器数据的信息

4.v1.0-mini

  • 包含有关数据集中每个样本的元数据信息,如时间戳、旋转矩阵等。元数据以 JSON 格式存储

5.v1.0-mini.txt

  • 说明文档

3. 点云可视化

我们来对 LiDAR 的点云数据来进行可视化,其点云数据格式是一个二进制文件,其 shape 为 [n,5]

  • n 代表点云的数量
  • 5 分别代表 x、y、z、intensity、ring index
  • x、y、z 代表基于激光雷达的 3D 坐标
  • intensity 是反射强度,指的是激光接收器接受的反射次数,通常用于区分物体或地面
  • ring index:点所在激光雷达扫描线的编号,比如 32 线激光雷达,其值就为 1-32

示例代码如下:

import numpy as np
import cv2file = "./data/n015-2018-11-21-19-38-26+0800__LIDAR_TOP__1542800855949460.pcd.bin"# [x, y, z, intensity, ring index]
pc = np.frombuffer(open(file, "rb").read(), dtype=np.float32)
pc = pc.reshape(-1, 5)[:, :4]x, y, z, intensity = pc.T# 设置图像的尺寸1024x1024
image_size = 1024# 数据归一化
# 点的坐标范围大概是100
pc_range = 100
x = x / pc_range    # [-1,1]
y = y / pc_range# 缩放到图像大小,并平移到图像中心
half_image_size = image_size / 2
x = x * half_image_size + half_image_size
y = y * half_image_size + half_image_size# opencv的图像,可以用numpy进行创建
image = np.zeros((image_size, image_size, 3), np.uint8)for ix, iy, iz in zip(x, y, z):ix = int(ix)iy = int(iy)# 判断是否在图像范围内if ix >= 0 and ix < image_size and iy >= 0 and iy < image_size:image[iy, ix] = 255, 255, 255cv2.imwrite("pointcloud.jpg", image)
cv2.imshow("image", image)
cv2.waitKey(0)

该示例代码主要是对 nuScenes 数据集中的激光雷达点云数据进行了可视化,具体流程如下:

  • 读取 nuScenes 数据集中的一个 .pcd.bin 文件,该文件中存储了激光雷达采集的点云数据。
  • 读取文件中的点云数据,并将其转换为 numpy 数组。
  • 解析 numpy 数组,得到点云数据中的 x, y, z, intensity 四个维度。
  • 由于点云数据的坐标值范围比较大,需要进行归一化操作。本代码采用将点云数据的范围缩放到 [-1, 1] 的方法进行归一化。
  • 缩放点云数据,并将其平移至图像中心。
  • 创建一个黑色的 1024x1024 的图像,并遍历所有点云数据中的点,将其所在位置的像素点设为白色。
  • 将生成的图像保存并显示

可视化图如下:

图3-1 激光雷达数据的二维可视化

我们可以考虑高度信息,绘制一张 3D 的点云图

  • 参考自:https://blog.csdn.net/Fzc_Ztt/article/details/116668330

示例代码如下:

import numpy as np
import mayavi.mlab# pip install mayavi
# pip install pyqt5# lidar_path换成自己的.bin文件路径
pointcloud2 = np.fromfile("./data/n015-2018-11-21-19-38-26+0800__LIDAR_TOP__1542800855949460.pcd.bin", dtype=np.float32, count=-1).reshape([-1, 4])# 提取点云坐标和反射强度
x = pointcloud2[:, 0]  # x position of point
y = pointcloud2[:, 1]  # y position of point
z = pointcloud2[:, 2]  # z position of point
r = pointcloud2[:, 3]  # reflectance value of point# 计算点云距离和高度角
d = np.sqrt(x ** 2 + y ** 2)  # Map Distance from sensor
degr = np.degrees(np.arctan(z / d))# 设置颜色
vals = 'height'
if vals == "height":col = z
else:col = d# 可视化点云数据
fig = mayavi.mlab.figure(bgcolor=(0,0,0),size=(640, 500))
mayavi.mlab.points3d(x, y, z,col,  # Values used for Colormode="point",colormap='spectral',  # 'bone', 'copper', 'gnuplot'# color=(0, 1, 0),   # Used a fixed (r,g,b) insteadfigure=fig,)mayavi.mlab.show()

上述示例代码使用了 numpy 和 mayavi 库,用于读取并解析激光雷达二进制数据,然后将点云数据可视化为 3D 效果图。首先从二进制数据中提取点的 x、y、z 坐标和反射强度,然后计算出每个点到传感器的距离,最后根据距离或高度值对点进行着色,并使用 mayavi 的 point3d() 函数将点云可视化出来。通过设置不同的参数,可以调整点云的颜色、大小和透明度等属性。最后使用 mayavi 的 show() 函数显示 3D 效果图

可视化图如下:

图3-2 激光雷达数据的三维可视化

我们还可以将不同视角的图片进行保存,然后利用 imageio 模块绘制动态图

示例代码如下:(from chatGPT)

import numpy as np
import mayavi.mlab as mlab
import os
import imageio# 读取点云数据
pointcloud = np.fromfile('./data/n015-2018-11-21-19-38-26+0800__LIDAR_TOP__1542800855949460.pcd.bin', dtype=np.float32, count=-1).reshape([-1, 4])# 提取点云坐标和反射强度
x = pointcloud[:, 0]
y = pointcloud[:, 1]
z = pointcloud[:, 2]
r = pointcloud[:, 3]# 创建 mayavi 场景
fig = mlab.figure(bgcolor=(0,0,0), size=(800, 600))# 绘制点云
points = mlab.points3d(x, y, z, r, mode='point', colormap='spectral')# 设置相机位置和视角
mlab.view(azimuth=0, elevation=90, distance=500, focalpoint=[0,0,0])
mlab.move(forward=-100)# 创建保存点云数据的文件夹
if not os.path.exists('./lidar_images'):os.makedirs('./lidar_images')# 保存不同视角的点云数据到文件夹
for i in range(36):mlab.view(azimuth=i*10, focalpoint=[0,0,0])mlab.move(forward=-20)mlab.savefig('./lidar_images/lidar_view_{}.png'.format(i))# # 文件夹路径
folder_path = './lidar_images/'# 获取文件夹下的所有图片路径
image_paths = sorted([os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.png')])# 读取所有图片并保存到列表中
images = []
for image_path in image_paths:images.append(imageio.imread(image_path))# 将所有图片合成为一张动态图
imageio.mimsave('./lidar.gif', images, fps=9)

可视化图如下所示,效果并不是很好,凑合看吧

AutoCV第八课:3D基础相关推荐

  1. 第八课 k8s网络基础学习-VxLAN基础

    第八课 k8s网络基础学习-VxLAN基础 tags: k8s网络 eNSP wireshark VxLAN 文章目录 第八课 k8s网络基础学习-VxLAN基础 第一节 VxLAN 1.1 VxLA ...

  2. NeHe OpenGL第二十八课:贝塞尔曲面

    NeHe OpenGL第二十八课:贝塞尔曲面 贝塞尔曲面: 这是一课关于数学运算的,没有别的内容了.来,有信心就看看它吧. 贝塞尔曲面 作者: David Nikdel ( ogapo@ithink. ...

  3. 打印循环换行_科学向日葵在线课堂 ——张老师讲Python 第八课 周而复始为循环2...

    点击蓝字关注我们 张老师讲编程--和爸爸妈妈一起学Python Python 的编辑器有很多,例如 PyCharm.Spyder.Notepad++等等,大家根据需要选择一个就好,初期程序代码量不大, ...

  4. 五年级上册计算机课如何拉表格,川教版小学信息技术五年级上册第八课 调整表格...

    第八课调整表格 教材分析: 本课是川教版小学<信息技术>第八课内容.学生已经通过前一节课的学习了掌握了在word中制作简单表格的基本方法,本课则是在前一节课的基础上,对表格进行调整与修饰, ...

  5. python画五角星-Python第八课 绘制五角星1.0

    第八课 绘制五角星1.0 学习目标: 1. 了解并学会使用turtle库. 2. 复习while循环. 教学重难点: turtle库的使用. 学习内容: 案例2: 使用turtle 库在Python中 ...

  6. 斯坦福大学机器学习第八课“神经网络的表示(Neural Networks: Representation)”

    斯坦福大学机器学习第八课"神经网络的表示(Neural Networks: Representation)" 斯坦福大学机器学习第八课"神经网络的表示(Neural Ne ...

  7. python画五角星代码_Python第八课 绘制五角星1.0

    第八课 绘制五角星1.0 学习目标: 1. 了解并学会使用turtle库. 2. 复习while循环. 教学重难点: turtle库的使用. 学习内容: 案例2: 使用turtle 库在Python中 ...

  8. 《迅雷链精品课》第八课:迅雷链多链结构

    上一节课我们学习了以太坊数据存储的相关内容,今天我们深入学习迅雷链的多链结构.通过这节课我们将了解迅雷链和主流区块链的特性,了解单链和多链各自的优缺点. 主流区块链单链的缺陷 单节点数据量大 比特币. ...

  9. 第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理

    第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第八课 ...

最新文章

  1. 好程序员web前端分享HTML基础篇
  2. SpockFS —— 基于 HTTP 的文件系统
  3. 移植uboot之修改代码支持NorFlash记录续集
  4. 一个典型的参数型跨站脚本漏洞
  5. Java的重载与覆盖,傻傻分不清!
  6. 《学习OpenCV3》第10章 滤波与卷积
  7. a和a的区别、二维数组的本质及多维数组
  8. tombstone 信息解析
  9. 计算机中显示器的分类,显示器怎么分类
  10. 梭子鱼网络:2018年网络安全威胁预测
  11. 高通(Qualcomm)LK源码深度分析(三)
  12. Android实现自动点击 - 无障碍服务
  13. css 选择器 如何 选择 大于 N 的情况 ?第n个元素之后的情况
  14. 我的电脑,虽然你很慢,但是我很爱你啊!
  15. 超级计算机浪漫展览,银河的浪漫-星星
  16. 2021春招已正式开启,阿里巴巴企业智能事业部内推,有意者看下文!
  17. 三分钟了解JVM的垃圾回收和三色标记
  18. 计算机楼综合布线设计图,宿舍楼综合布线设计含图.doc
  19. Angular CLI ng常用命令整理
  20. 删除固定时间以前的文件与文件夹bat文件

热门文章

  1. vue build报错 精辟
  2. Java学习之路05---运算子
  3. Linux三剑客:grep、sed、awk基础入门学习笔记
  4. hive操作数据库实验
  5. SoftEther的使用
  6. INNER JOIN ON 用法。
  7. 超低成本DDoS攻击来袭,看WAF如何绝地防护
  8. JavaScript parseInt()方法详解
  9. java的getshape()_World Wind Java开发之六——解析shape文件(转)
  10. Android 的输入法适配设置windowSoftInputMode的9种方式