ORB-SLAM2代码 单目初始化
ORB-SLAM2在加载系统过程中,首先为系统创建地图,关键帧数据库,然后在创建的Tracking、LoaclMapping、LoopClosing线程中传入地图和关键帧数据库地址指针,可以实现数据共享。然后通过设置进程间的指针,可以实现进程间的信息调用。
当系统传入图像数据时,要为每一幅图像构造一帧数据,在构造每帧数据时,为每一幅图像构造了八层图像金字塔,构造完成图像金字塔之后。对每层图像进行网格的划分,在每个cell中提取FAST角点,当提取不出来角点时,降低阈值重新进行提取。然后使用四叉树的方式对角点进行均匀化操作,使角点分布均匀。然后对角点提取描述子。最终获得ORB特征点。
当提取完成ORB特征点之后,使用OpenCV函数对特征点去畸变。将去完畸变的特征点分配到图像网格中。
接着进来MonocularInitialization()函数,该函数实现了单目相机初始化的过程!!!
首先系统会判断当前帧所提取到的特征点数目是否大于100,若小于100,系统会丢弃当前帧,否则将当前帧作为初始的参考帧。然后系统会等待下一帧的到来。
下一帧到来时,系统会判断当前帧的特征点数目是否大于100,若小于100,系统会重新设置初始化器。直到连续的两帧上的特征点数目都大于100,系统才会向下进行。
当系统的前两帧满足要求时,就会进行特征点匹配。通过遍历参考帧中图像金字塔的第0层的所有ORB特征点,在当前帧图像金字塔的第0层
的固定窗口中进行搜索,只要满足搜索半径,都作为潜在的匹配点。然后通过比较描述子之间的距离,获得匹配关系。当匹配点的数量小于100时,则删除初始化器,重新进行初始化。
当匹配点的数量大于100时,则通过H模型或者F模型求解变换矩阵。
首先由于匹配的特征点的数量大于100,也不能够保证没有无匹配点,所以采用随机采样一致性算法,随机采点。然后系统开辟两个线程进行求解单应矩阵和本质矩阵。
求解单应矩阵&本质矩阵
首先将匹配的特征点进行归一化,使用8点法计算H矩阵,然后使用重投影误差对H矩阵进行打分,得到得分最高的H矩阵。
同理,获得得分最高的F矩阵。
求解旋转矩阵和平移向量
在获得单应矩阵和本质矩阵之后,通过评比它们两者之间的得分,选择是通过单应矩阵或者本质矩阵进行恢复旋转矩阵和平移向量。
通过单应矩阵恢复旋转矩阵和平移向量,分解单应矩阵之后会得到8组解,然后通过检查三维点数目在相机前方最多的对应的旋转矩阵和平移向量。
通过本质矩阵恢复旋转矩阵和平移向量,分解本质矩阵之后会得到4组解,然后通过检查三维点数目在相机前方最多的对应的旋转矩阵和平移向量。
单目初始化结束!!!