admin 管理员组

文章数量: 1086019

DSO源码解析学习笔记(初始化)

FullSystem.cpp入口

main 主线程用于显示

  • ImageFolderReader文件读取 支持从zip压缩文件读取
  • getUndistorterForFile读取相机配置文件
    对配置文件按行读取,会根据参数的个数判断相机畸变。
    例如在函数UndisttorRadTan会利用readFromFile函数(使用配置文件参数地址configFileName)进行读取。

    第一行相机模型参数,第二行相机像素大小。通过参数个数判断模型类型。

    在选取图像像素点坐标时会减去0.5,不使用网格焦点而使用中点位置,思想类似中值定理,计算残差效果可能会更好。

    第三行相机图像类别,是否裁剪。参数读完之后,判断是否需要重新计算内参,是否需要裁切(畸变是否严重)。

    配置文件第四行,裁剪之后的图像大小。通过remapX,Y将畸变前和畸变后的坐标对应,裁剪之后通过函数makeOptimalK_crop重新求解内参。
  • makeOptimalK_crop
    找到图像最大值和最小值范围,使其畸变矫正后的点都能在原图像中找到。由于不知道内参,只能在单位平面上操作。
    从-5到5保证精度小,足够满足相机覆盖。

    求出最大最小XY之后进行加畸变操作,目的是判断该点是否在原图像内。如果不在图像内便更新范围。
    校正畸变后,得到新的相机内参。
  • 接下来读入相机的光度标定参数,通过调用函数PhotometricUndistorter进行光读校正。

  • PhotometricUndistorter
    读取响应函数G

    读取衰减系数,为了便于去掉衰减系数,对其取逆。

    至此读取已经配置文件结束,得到reader。
  • 接下来获取图像,使用函数getImage

    使用getImage函数之后调用去畸变函数。

    在去畸变函数中,使用自定义的图像类型,使用数组,在其中多存了一个曝光参数。(噪声添加为了测试)最终返回一个新图像。

    在得到新图像之后,传到函数addActiveFram中,是整个系统的入口函数(FullSystem.cpp)。
  • addActiveFram
    首先创建基本的数据类型,并进行响应的初始化

    FrameShell类型相当于FrameHessian的简化版,存储位姿等。接下来判断是否初始化,如果没有初始化则进入初始化过程。
  • 初始化过程
    如果初始化时没有设置第一帧的话则加入第一帧。
    CalibHessian* HCalib 相机内参类通过makeK函数得到相机内参。

    针对不同层数选择大梯度像素, 第0层比较复杂1d, 2d, 4d大小block来选择3个层次的像素

    第0层在提取特征像素时,首先计算梯度直方图,根据阈值选择不同层上的点,然后根据提取的点数量进行删减或增加。(最终如果还是较多可以随机删除一些点)。
    其他层根据稀疏系数,对于高层(0层以上)选择梯度最大的位置点。然后判断是否满足要求,通过改变网格进行叠代。

    在选出的像素中, 添加点信息,通过makeNN函数生成每一层点的KDTree,求取父节点或者邻接点集。最后将一些参数初始化变完成了第一帧的设置。
  • 接下来图像也通过addActiveFram函数进入,但此时已经设置好第一帧,接下来进入跟踪。
    首先将当前帧放进显示线程中。

    第二步判断位移是否足够大,如果不满足要求则重新初始化,参数snapped在设置第一帧最后被确定。

    从顶层到底成层,由粗到精优化。求解正定方程返回残差。
    求解增量,更新状态。更新后计算残差,若能量减少则接受更新。
    优化后赋值位姿,从底层计算上层点深度。
  • 如果更新成功,从初始化中提取信息用于跟踪。此时完成初始化过程。

  • 注释版DSO:

本文标签: DSO源码解析学习笔记(初始化)