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源码解析学习笔记(初始化)
版权声明:本文标题:DSO源码解析学习笔记(初始化) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1686730784a30361.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论