本项目使用ZED2相机制作数据集以评估视觉里程计的精度和鲁棒性,数据集中收集了左右相机图像、相机内参、时间戳、轨迹真值
本项目是在Windows10 64-bit系统上运行的
-
Python:使用Python作为开发相机功能的编程语言,版本为3.10.2
-
Numpy:使用Numpy管理数据,版本为1.22.2
-
OpenCV:OpenCV用来进行基本的图像显示与存储,版本为4.5.5.62
-
OpenGL:OpenGL用来对位姿跟踪过程中对相机位姿和轨迹进行三维可视化,版本为3.1.6
-
ZED SDK:获取使用和开发ZED相机所需的API,版本为3.8
-
Cuda,Cudnn:调用GPU的并行计算功能,加速运行ZED相机的深度感知,Cuda的版本为10.2,Cudnn的版本为8.7.0
本项目录制数据集时提供实时录制和离线录制两种模式。
在实时录制模式中,ZED相机通过grab()
读入视频流的图像后,顺序执行以下计算量较大花费时间较多的功能:保存图像到硬盘、位姿估计***、***轨迹三维可视化。只有在上述功能执行完成后,ZED相机才会实时的继续读入视频流中的下一帧图像,然而在经过大计算量的处理后,实际上grab()
读入的下一帧已经是相机拍摄到的往后几帧的图像,这就造成了掉帧。因此尽管设置了相机初始帧率参数为60FPS,在图像分辨率为672*376
,保存格式为JPEG
格式时,录制的数据集实际图像帧率只能达到12FPS
。
ZED相机支持录制SVO格式视频,SVO格式视频中不仅包含了图像信息,还可以从中提取出时间戳、轨迹真值等信息。因此可以选择先录制SVO视频而不做处理,随后再从这个视频中离线导出所需要的数据。这样就可以避免实时录制模式中掉帧的缺点。设置参数以60FPS录制SVO视频,在图像分辨率为1280*720
,保存格式为PNG
格式时,导出的数据集图像帧率可以达到60FPS
。
运行下面的指令以运行实时录制模式:
cd .\Realtime
python main.py
首先运行下面的指令以录制SVO视频,需要传入录制文件名参数
cd .\SVO
python record.py 1.svo
playback.py
可以将录制的视频回放,需要传入文件名参数
python playback.py 1.svo
最终运行export.py
程序导出数据
python export.py
生成的相关数据文件如下:
-
左右图像文件
images
,图像文件以时间戳命名 -
相机内参文件
calib_stero.txt
Pinhole fx fy cx cy 0
height width
crop
height width
baseline
- 时间戳文件
times.txt
timestamp(microsecond)
- 轨迹真值文件
groundtruth.tum
timestamp t_x t_y t_z q_x q_y q_z q_w
│ main.py: 实时录制功能的主程序
│ path.py: 提供文件路径
│ record.py: 封装了保存图像、保存相机内参、保存时间戳以及轨迹真值文件的函数
│ utils.py: 提供了坐标变换、图像显示等基本函数
├─ data
│ │ calib_stereo.txt: 相机内参文件
│ │ groundtruth.tum: 轨迹真值文件
│ │ times.txt: 时间戳文件
│ └─ images
│ ├─ image_0: 左目图像
│ └─ image_1: 右目图像
├─ ogl_viewer
│ │ tracking_viewer.py: 三维可视化相机位姿和运动轨迹
│ │ zed_model.py: 模型文件
│ └─ __pycache__: 缓存文件
└─ __pycache__: 缓存文件
│ 1.svo: 测试视频文件
│ export.py: 离线导出SVO视频中包含的信息,包含左右图像、时间戳
│ path.py: 提供文件路径
│ playback.py: 回放SVO视频
│ record.py: 录制SVO视频
├─ data
│ │ calib_stereo.txt: 相机内参文件
│ │ groundtruth.tum: 轨迹真值文件
│ │ times.txt: 时间戳文件
│ └─ images
│ ├─ image_0: 左目图像
│ └─ image_1: 右目图像
└─ __pycache__: 缓存文件
stereolabs/zed-python-api: Python API for the ZED SDK (github.com)
Python API Documentation | Python API Reference | Stereolabs