基于自己的数据集实现dso-slam三维重建方案

在搭建完dso slam方案的运行环境后,使用官方给定的数据集能够实现效果不错的三维重建。

由于官方给定的数据集已经进行了校准,这样的话,用我们自己构建的数据集会实现怎样的效果?

环境配置:

  • Ubuntu 18.04(使用VirtualBox安装的虚拟机)
  • iphone6s拍摄的数据集

DSO 配置安装

参照 JakobEngel/dso (GitHub 文档)。在配置安装过程中也遇到了一些问题,主要有下面三个方面:

  • Pangolin是一个用来可视化的库,大部分slam方案用它来进行可视化和人机交互。其下载和安装教程可见:(https://github.com/stevenlovegrove/Pangolin)。按照教程在个人环境中出现了一些问题,换了如下的教程openvSLAM安装笔记_南乔枝6060的博客-CSDN博客_openvslam。
  • OpenCV肯定是必不可少的了。OpenCV的安装也是按照上面openvSLAM的安装教程。安装过程中,只要不报错,报警告是可以忽略,不影响使用。
  • 在安装编译dso的时候,会报内存不够。使用命令 make -j4或者make -j或者make -j2多试几次就行了。

最后不要忘记,每个库的安装编译最后都需要make install将可执行文件复制到最终的路径。不然在安装dso时会出现找不到指定的库的错误。

官方离线数据集测试安装的DSO

数据集下载:(Computer Vision Group - Datasets - Monocular Visual Odometry Dataset),每个视频序列文件夹以 sequence_XX 命名,其中包括如下的文件

  •  image.zip(视频序列),需要安装ziplib用于直接读取zip压缩文件中的图像。也可以直接用解压缩后的文件夹images中的图像;
  • camera.txt(相机内参及畸变参数等)。官方的数据集已经给定了相机的参数,并且在官方文档中说明了不同相机模型下的相机参数配置的要求。因此在运行自己的数据集的时候需要重新标定采集数据集的相机,然后配置该文件。
  • pcalib.txt, vignette.png (二者为 photometric calibration 的标定参数,详见论文)文件。如果为了获得更好的三维重建效果可以尝试重新基于自己的数据集配置该文件。(photometric calibration:光度标定,是 TUM Vision Group 提出的一种相机除了几何标定之外的光度参数的标定方法,详细内容可参考)

运行:

cd dso
./build/bin/dso_dataset \
		files=XXXXX/sequence_XX/images.zip \
		calib=XXXXX/sequence_XX/camera.txt \
		gamma=XXXXX/sequence_XX/pcalib.txt \
		vignette=XXXXX/sequence_XX/vignette.png \
		preset=0 \
		mode=0

参数解析:

  • 前4项就是视频序列文件夹中的文件。其中files可以改成images(即解压缩后的文件)
  • preset 表示系统以何种方式运行(默认模式/快速模式,非实时/实时),preset=0 表示默认模式且可以非实时。
  • mode 表示相机的标定情况,mode=0 表示相机完全标定(包括几何标定和 photometric 标定)。
  • 更详细的内容还有其它的一大堆参数的具体含义详见 (https://github.com/JakobEngel/dso#3-usage)。

在这些参数中主要关注的就是图像数据集文件夹images和相机参数文件camera.txt。

使用自己的数据集

dso slam运行自己的数据集主要需要考虑两个方面:

  • 图像数据集文件夹iphoneimages
  • 相机参数文件camera.txt

构建自己的数据集iphoneimages

使用iphone6s拍摄一段视频,然后经过拆帧获取大约几千张室内场景的图片。构建的图片需要满足一下要求:

  • 图片格式最好是jpg,看有些博主说png格式的图片运行会报错;
  • 图片的分辨率最好和TUM数据集中的图片要求一致1280x1024,且需要转换成灰度图;
  • 图片的命名也需要按照TUM数据集中的命名,格式按照0000x.jpg。

配置camera.txt文件,也是几何校准文件(Geometric Calibration File):

单目相机配置要求(对应于官方文档中Calibration File for Pre-Rectified Images)

Pinhole fx fy cx cy 0
in_width in_height
"crop" / "full" / "none" / "fx fy cx cy 0"
out_width out_height

其中的参数:

  • 第一行,相机模型,相机的内参,以及畸变参数。为了向后兼容,“Pinhole”可以省略;
  • 第二行,输入的图片分辨率大小;
  • 第三行,设置校准模型(Rectification modes)。DSO 支持校正到用户定义的针孔模型 ( fx fy cx cy 0),或者具有自动裁剪图像到最大矩形、明确定义的区域 ( crop) ,或者将保留完整的原始视野,主要用于调试( full);
  • 第四行,如果第三行设置校准模型是crop,需要设置裁剪后的分辨率大小。测试后发现只有in和out不一样就能运行,没有具体的裁剪标准。

第三行当设置模型为用户自定义的针孔模型  ( fx fy cx cy 0),参数 ( fx fy cx cy 0)和第一行的 ( fx fy cx cy 0)并不一样,需要按照官方文档配置:

K(0,0) = width * fx
	K(1,1) = height * fy
	K(0,2) = width * cx - 0.5
	K(1,2) = height * cy - 0.5

手机摄像头标定

参考大佬的博文:

ORB-SLAM2 运行 —— ROS + Android 手机摄像头 icon-default.png?t=M3K6https://www.cnblogs.com/MingruiYu/p/12404730.html

在没查到大佬的这篇文章时,试着用网上找的一段python程序进行相机标定。但是发现每次运行的标定结果都不一样,检查后发现并不是程序的问题 ,最后也没确定问题在哪,有大佬知道的话,还请不吝赐教。

参数填入 DSO 的相机标定文件

在images同一级文件夹中建立一个 iphoneCamera.txt 文件,用于按照 DSO 要求的格式存放相机的参数。

iphoneCamera.txt 文件格式可参考上面提到的camera.txt文件。具体到本实现中,该标定文件的内容格式可为:

fx fy cx cy 0
1280 640
k1 k2 k3 k4 0
640 480

其中的参数:

  • fx fy cx cy 0)是按照上面提到的教程获得的手机摄像头标定参数;
  • ( k1 k2 k3 k4 0)是按照官方文档计算出来的参数。

运行以及效果展示:

cd dso
./build/bin/dso_dataset \
		files=XXXXX/sequence_XX/iphoneimages.zip \
		calib=XXXXX/sequence_XX/iphoneCamera.txt \
		gamma=XXXXX/sequence_XX/pcalib.txt \
		vignette=XXXXX/sequence_XX/vignette.png \
		preset=0 \
		mode=0

基于自己的数据集实现dso-slam三维重建方案_第1张图片

 

发现:轨迹很飘,建图还行

参考资料

openvSLAM安装笔记_南乔枝6060的博客-CSDN博客_openvslam

GitHub - JakobEngel/dso: Direct Sparse Odometry

Computer Vision Group - Datasets - Monocular Visual Odometry Dataset

DSO 安装及运行 —— dso_ros + Android 手机摄像头 - MingruiYu - 博客园

 

你可能感兴趣的:(自动驾驶,计算机视觉,opencv,图像处理)