学习参考自:《三维重建基础》鲁鹏
数据结构
地图识别数据库
-
视觉词典
- 通过对图像提取orb特征点,再利用聚类算法得到。
是一个提前做好的一个通用词典。
- 通过对图像提取orb特征点,再利用聚类算法得到。
-
关键帧词袋
- 采用TF-IDF的表示方法和倒排索引的存储结构。
- 流程:每当有新的图片加入时
- 特征点检测与提取
- 量化——用词袋表示
- TF-IDF加权
- 倒排索引
- TF-IDF
- 公式: t j = n i j n i lg N n j t_{j} =\frac{n_{ij}}{ni} \lg_{\frac{N}{n_{j}} } tj=ninijlgnjN
- n i j n i \frac{n_{ij}}{ni} ninij:表示该词在本张图片中的比重,若比重大则表示这个词是该图片的一个重要特征
- lg N n j \lg_{\frac{N}{n_{j}} } lgnjN:表示该包含该词的图片比例,若比重小则表示这个词是该图片特有的、有较高区分度的,反之每张图都具有则表示没有区分度。
- 倒排索引
- 因为需要将当前图片的词袋向量与库中图片计算余弦相似度,找到最接近的图片。
- 通过倒排索引,索引关键字为单词,值为包含该词的文档id序列。
地图数据库
- 地图点
- 世界坐标系下3D坐标
- 观测方向,可以观测到该点的视图的观测方向均值
- ORB特征描述子
- 该点能被观测的最大最小距离
- 关键帧
- 摄像机位姿
- 内参
- orb特征描述符
- 共视图
- 两个关键帧之间共同3维点的个数超过15则存在一条边
- 本质图
- 包含共视图的所有节点,边数更少,用于回环校正
- = 生成树 + 共识图权重超过100的边 + 回环边
跟踪线程
目的:确定当前图片位姿
- 初始化:最初的两张图片建立点云
- 计算特征点;
- 同时计算本质F矩阵和单应矩阵H;
- 计算F和H误差,选其一;
- 对F或H进行分解,三角化重构3维点;
- GlobalBA优化。
- 位姿估计
- 基于前一帧估计当前位姿;
- 用估计的R和T,将前一帧观测的3维点投影到当前帧;
- 如果有足够对应点,依据2D-3D对应点计算相机位姿;失败则转到全局重定位。
- 全局重定位:
- 用当前词袋,在数据库中找匹配度大于门限的关键帧(通常有多个);
- 特征点匹配->2D-3D关系,PnP位姿估计->迭代优化
- 位姿优化:
- 找到于当前帧相连的集合k1,与当前帧不相连但与k1相连的集合k2
- k1 + k2 作为局部地图点
- 是否作为关键帧:对每一帧都要估计位姿,因为这样有利于下一帧的位姿估计。但是不是每一帧都要作为关键帧,只有在具有一定变化的时候才作为关键帧。
判断条件:
- 距离上次全局重定位经历超过20帧
- 局部地图线程空闲
- 距离上个关键帧插入超过20帧
- 当前帧至少50个关键点
- 当前帧与Kref共视点相似小于90%
建图线程
目的:完成局部地图构建
- 地图点插入
- 更新共视图,增加新节点Ki,更新共识图连接关系
- 更新生成树的节点关系
- 计算该新增关键帧的词袋表示,为新增地图点做准备
- 地图点剔除,满足下面条件才被保存
- 实际观测比例大于理论值的25%
- 地图点被创建后,再经过3个关键帧都可以观测到它
- 新地图点生成
- 选取共视程度最高且基线宽度大于某阈值的关键帧进行特征点匹配与三角化,对重构结果进行尺度、重投影误差、视差不宜过小。
- 通过投影到其它视图中检验
回环修正线程
目的:回环检测和修正系统漂移(减少误差的累积)
- 位姿修正,求相似性矩阵Sij,修正位姿
- 回环帧及其共视帧地图点投影到当前帧及其共视关键帧,寻求匹配融合。
- 更新连接关系。
- 基于本质图,优化所有关键帧位姿