[学习SLAM]DSO光度标定程序配置和使用(1)

57 篇文章 20 订阅
2 篇文章 0 订阅

光度标定原理详见:

DSO之光度标定

一、项目地址

https://github.com/tum-vision/mono_dataset_code

对应论文《A Photometrically Calibrated Benchmark For Monocular Visual Odometry

二、安装

1.下载源码

git clone https://github.com/tum-vision/mono_dataset_code.git

2.安装Eigen和OpenCV

sudo apt-get install libeigen3-dev libopencv-dev

3.安装zip文件解析库

    sudo apt-get install zlib1g-dev
     
    cd mono_dataset_code/thirdparty
    tar -zxvf libzip-1.1.1.tar.gz
    cd libzip-1.1.1/
    ./configure
    make
    sudo make install
    sudo cp lib/zipconf.h /usr/local/include/zipconf.h    # (no idea why that is needed).

4.安装aruco marker dection ,用来标定渐晕

安装教程转自(科学上网):http://maztories.blogspot.de/2013/07/installing-aruco-augmented-reality.html

    cd mono_dataset_code/thirdparty
    tar -zxvf aruco-1.3.0.tar.gz
    cd aruco-1.3.0/
    mkdir build
    cd build
    cmake ..
    make
    sudo make install

5.编译主程序

    cd mono_dataset_code
    cmake . && make

三、准备数据

所需数据格式参考 src/BenchmarkDatasetReader.h

相机参数文件格式参考 src/FOVUndistorter.cpp
1.将图片存储于指定路径 PATH 下

    数据为zip文件时,可以将文件直接放入;

    数据为图像序列时,需要将建立文件夹images,将图像序列放入 PATH/images 下(注意有s)
2.将相机参数文件放入 PATH 下

    (1)文件名称为camera.txt

    (2)具体文件格式可以参考LSD-SLAM中的 llsd_slam_core/src/util/Undistorter.cpp

    (3)原程序中相机使用PTAM的标定程序进行标定,标定过程可以参考博客《配好lsd_slam后的使用PTAM工具标定相机

    (4)camera.txt的具体格式如下:

    fx/width fy/height cx/width cy/height d
    in_width in_height
    "crop" / "full" / "none" / "e1 e2 e3 e4 0"
    out_width out_height

             1)第一行 5个数据,赋值给inputCalibration[5]数组,格式为%f,数据内容表示

             (fx/width fy/height cx/width cy/height d),其中第五个参数d表示视场角(field of view);

             2)第二行 2个数据,分别赋值给in_width和in_height,表示输入图像的大小

             3)第三行 1个字符串参数:

                     “none”表示不进行校正,remapX和remapY都被置为nullptr,valid置为false

                     “crop”表示对图像进行裁剪,根据原图(cx,cy)处上下左右的最远距离进行图像的保留,使像素均为有效像素

                     “full”表示保留全部图像,根据原图(cx,cy)的左上、右上、左下、右下进行图像的保留

             4)第四行 2个参数表示输出图像的宽度和高度

             对应的相机模型可以参考博客《PTAM算法流程介绍

             注意:该方法使用了鱼眼相机的等距投影模型,视角和点距光心的距离成正比),具体参考文献《Straight lines have to be straight》,其公式(13)(14)如上图前两式所示。其中,参数w表示畸变后相机视场角(Field of View),即物理上相机的视场角。而经过鱼眼模型的变换,相机经过畸变校正后的视场角为

假设对应于视场角(注意视场角包括左右两侧)、像素距光心的最大距离为1,即相机的焦距f。

           球面等距投影模型如下:

r_d=\frac{1}{\omega}arctan(2r_utan(\frac{\omega}{2}))\label{equ:square}            

r_u=\frac{tan(r_d \omega)}{2tan \frac{\omega}{2}}

*博主认为该处公式有误,按照等距投影模型,其原始的公式应为:

\begin{align*} r_{d}&=f\theta \\ &=farctan(\frac{r_u}{f})\\ &=\frac{1}{\omega}arctan(\omega r_u) \end{align*}

r_{u}=\frac{1}{\omega}tan(\omega r_d)

但687次引用的文章应该没有什么问题啊......,考虑下式

\begin{align*} \theta &=arctan(2r_utan(\frac{\omega}{2}))\\ &=arctan({r_u}/({\frac{1}{2tan(\frac{\omega}{2})}}))\end{align*}

注意到,式中用{1}/({2tan({\omega}/{2})}),代表了OA的距离(原本的表示为1/ \omega ),式中认为{AB}/{AO}=tan(1/ \omega),但通过观察不难发现,正确的关系应为{AC}/{AO}=tan(1/ \omega)

综上,原文中相机模型可能将AC近似等于了AB,但也有可能使用了其它的模型。
3.将曝光时间文件放入 PATH 下

文件名称为times.txt

(注意有s)

文件内容可以使用两种格式,系统会自动加以选择:

(1)原始格式

——格式为(图片id 时间戳 曝光时间)

——数据格式为(%d %lf %lf)

(2)或者可以省略时间戳

——(图片id 曝光时间)

——数据格式为(%d %lf)

四、标定响应函数

1. 运行可执行文件

cd mono_dataset_code/bin

./responseCalib path_to_your_data/

(对于图片序列会自动添加images/在路径后边)

./responseCalib ~/Data_mao/Data_real/Data_for_calib/
2. 标定结果

标定结果存储于 mono_dataset_code/bin/photoCalibResult/ 中

E-0.png存储初始的辐照度,初值值设置为所有图片对应像素的平均值

E-%d.png 每次优化过后场景辐照度的值;E-%d16.png 归一化到255*255上的图片

G-%d.png 每次迭代后的响应曲线

pcalib.txt 响应曲线U

原始数据集,在同一场景下变换相机曝光时间(MYNTEYE S1030IR),采集不同曝光时间下的图片

 

标定得到的响应函数(旋转以后的图像)

 responseCalib响应标定:校准响应函数。

从一组图像执行光度校准,在不同曝光下显示完全相同的场景。运行(并用数据集的位置替换X)。注意后面的斜线):
./responseCalib X/CalibrationDatasets/narrow_sweep1/"
输出一些中间结果,pcalib.txt包含校准的反向响应函数到./photoCalibResult。有关详细信息,请参见代码.

 

五、标定渐晕

vignetteCalib:校准vignette。

从一组图像执行光度校准,显示带有ARMarker的平面。运行(并用数据集的位置替换X)。注意后面的斜线):
./vignetteCalib X/CalibrationDatasets/narrow_vignette/"
输出一些中间结果,vignette.png(16位png)包含校准的vignette函数。vignettesmooded.png是一个稍微平滑的版本,主要用于删除黑色边框(边框上的像素永远不会被观察到)。有关详细信息,请参见代码。警告:需要大量内存(1000个输入图像需要16GB内存)!可以很容易地改变,代价是运行时稍慢。。。不过,你得自己动手。

六、回放数据

playbackDataset 回放数据集:读取图像,光度不失真和校正。

显示数据集的图像。这是关于如何读取数据集的示例代码。运行(并用数据集的位置替换X)。注意后面的斜线):

./playDataset X/sequence_01/  

可选地,校准用于

  • 校正(r)
  • 响应函数反演(g)
  • 渐晕图删除(v)
  • 去除过度曝光(白色)图像。(o)。

按相应的键可切换选项。有关详细信息,请参见代码。

用法:Matlab评估代码

实现跟踪轨迹与地面真值段的Sim(3)对准,并随后计算不同的误差值。有关示例,请参见MatlabEvaluationCode/Example.m和一些有关计算值的文档。此外,我们还包括所有50个序列的DSO计算示例结果。(EVO 核心 八分 类似的)

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值