AutoCV第八课:3D基础
目录
- 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基础相关推荐
- 第八课 k8s网络基础学习-VxLAN基础
第八课 k8s网络基础学习-VxLAN基础 tags: k8s网络 eNSP wireshark VxLAN 文章目录 第八课 k8s网络基础学习-VxLAN基础 第一节 VxLAN 1.1 VxLA ...
- NeHe OpenGL第二十八课:贝塞尔曲面
NeHe OpenGL第二十八课:贝塞尔曲面 贝塞尔曲面: 这是一课关于数学运算的,没有别的内容了.来,有信心就看看它吧. 贝塞尔曲面 作者: David Nikdel ( ogapo@ithink. ...
- 打印循环换行_科学向日葵在线课堂 ——张老师讲Python 第八课 周而复始为循环2...
点击蓝字关注我们 张老师讲编程--和爸爸妈妈一起学Python Python 的编辑器有很多,例如 PyCharm.Spyder.Notepad++等等,大家根据需要选择一个就好,初期程序代码量不大, ...
- 五年级上册计算机课如何拉表格,川教版小学信息技术五年级上册第八课 调整表格...
第八课调整表格 教材分析: 本课是川教版小学<信息技术>第八课内容.学生已经通过前一节课的学习了掌握了在word中制作简单表格的基本方法,本课则是在前一节课的基础上,对表格进行调整与修饰, ...
- python画五角星-Python第八课 绘制五角星1.0
第八课 绘制五角星1.0 学习目标: 1. 了解并学会使用turtle库. 2. 复习while循环. 教学重难点: turtle库的使用. 学习内容: 案例2: 使用turtle 库在Python中 ...
- 斯坦福大学机器学习第八课“神经网络的表示(Neural Networks: Representation)”
斯坦福大学机器学习第八课"神经网络的表示(Neural Networks: Representation)" 斯坦福大学机器学习第八课"神经网络的表示(Neural Ne ...
- python画五角星代码_Python第八课 绘制五角星1.0
第八课 绘制五角星1.0 学习目标: 1. 了解并学会使用turtle库. 2. 复习while循环. 教学重难点: turtle库的使用. 学习内容: 案例2: 使用turtle 库在Python中 ...
- 《迅雷链精品课》第八课:迅雷链多链结构
上一节课我们学习了以太坊数据存储的相关内容,今天我们深入学习迅雷链的多链结构.通过这节课我们将了解迅雷链和主流区块链的特性,了解单链和多链各自的优缺点. 主流区块链单链的缺陷 单节点数据量大 比特币. ...
- 第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理
第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第八课 ...
最新文章
- 好程序员web前端分享HTML基础篇
- SpockFS —— 基于 HTTP 的文件系统
- 移植uboot之修改代码支持NorFlash记录续集
- 一个典型的参数型跨站脚本漏洞
- Java的重载与覆盖,傻傻分不清!
- 《学习OpenCV3》第10章 滤波与卷积
- a和a的区别、二维数组的本质及多维数组
- tombstone 信息解析
- 计算机中显示器的分类,显示器怎么分类
- 梭子鱼网络:2018年网络安全威胁预测
- 高通(Qualcomm)LK源码深度分析(三)
- Android实现自动点击 - 无障碍服务
- css 选择器 如何 选择 大于 N 的情况 ?第n个元素之后的情况
- 我的电脑,虽然你很慢,但是我很爱你啊!
- 超级计算机浪漫展览,银河的浪漫-星星
- 2021春招已正式开启,阿里巴巴企业智能事业部内推,有意者看下文!
- 三分钟了解JVM的垃圾回收和三色标记
- 计算机楼综合布线设计图,宿舍楼综合布线设计含图.doc
- Angular CLI ng常用命令整理
- 删除固定时间以前的文件与文件夹bat文件