ORB-SLAM2源码分析(单目)——单目地图初始化

ORB-SLAM2源码分析(单目)——单目地图初始化

一、 单目地图初始化(MonocularInitialization)

单目地图的初始化,与RGBD和双目相机不同,单目地图初始化过程会比较久,原因是单目不能向RGBD和双目一样,能直接获取到深度,从而构建地图点。单目需要通过两帧之间进行特征点匹配,再用三角化来构建地图点,所以单目对初始化的两帧之间有一定的要求,确保能提取到足够的特征点,且两帧之间的匹配的也足够多,从而通过三角化方式,构建出地图点

在这里插入图片描述

二、 初始化的两帧特征点必须大于一定阈值

在这里插入图片描述

初始化帧所提取的特征点一定要大于设定的阈值,为了后续进行特征匹配,能匹配出足够多的匹配点

三、 初始化的两帧之间进行特点匹配,匹配点要大于一定阈值

在这里插入图片描述

足够多的特征匹配点是为了后续进行三角化,能够生成足够多的地图点,从而对地图进行初始化

四、 初始化帧之间的特征点匹配函数(SearchForInitialization)

在这里插入图片描述

调用此函数,输入初始化参考帧和当前帧,用于重投影搜索的搜索窗口。返回对应的特征点匹配信息和匹配成功的点
具体代码实现如下:

(1) 构建旋转直方图

在这里插入图片描述

为了后续筛选出直方图中的非主流旋转的特征点,因为图像在进行旋转时,整体的像素点都会进行统一的方向进行旋转一定角度,所以我们要去除不是主流方向上的旋转角度。
(2) 遍历参考帧的特征点,在当前帧进行半径窗口进行搜索,找出候选特诊点(GetFeaturesInArea)
在这里插入图片描述

这边不使用暴力匹配法,因为暴力匹配法太耗时了。这里直接输入参考帧的特征点坐标是因为两帧之间的运动相对较小,所以图像之间的变化不会差异很大,且不知道当前帧与之参考帧的变换矩阵,而后续一般都是通过变换矩阵输入投影到当前帧的坐标,所以以参考帧的特征点为坐标,在当前帧上画出一个圆,在这个圆内筛选出对应的匹配特征候选点。
在这里插入图片描述

GetFeaturesInArea内部实现如下:
1) 计算特征点搜索的范围:
在这里插入图片描述
在这里插入图片描述

将图像切分成网格,在当前帧中以参考帧的特征点坐标为圆心,半径为r的圆外接一个正方形,获得正方形内的特征点作为候选匹配点
2) 获取圆内的特征点作为候选
在这里插入图片描述

(3) 获取参考帧的特征点描述子,与之前找到的候选特征点的描述子进行距离计算,筛选出最佳匹配点和次佳匹配点
在这里插入图片描述

通过汉明距离筛选候选特征点,选出最佳特征点和次佳特征点
(4) 对筛选出来的最佳匹配点和次佳匹配对进行检查
在这里插入图片描述

即使我们计算出来最佳描述子的距离,这个距离要小于一定阈值。
最佳距离比次佳距离要小于设定的比例,这样特征点辨识度更高。
如果找到的候选特征点之前已经匹配过了,说明发生了重复匹配,将原来的匹配也删掉
(5) 筛除旋转直方图中“非主流”部分

在这里插入图片描述

五、 获取初始化两帧的相对位姿,并且通过三角化得到初始地图点(Initialize)

在这里插入图片描述
在这里插入图片描述

通过上面获取到的特诊点匹配信息,计算出当前相机的位姿,并且通过三角化生成初始地图点
代码具体实现如下:
(1) 重新记录特征点对的匹配关系
在这里插入图片描述

(2) 根据RANSAC迭代次数,对每一次迭代随机选取八对匹配点
在这里插入图片描述

我们后续将使用八点法,计算出单应矩阵和基础矩阵,使用得分高的矩阵,来恢复相机位姿。所以每次迭代都要使用不同的八对点,从而计算出得分高的矩阵
(3) 通过八个匹配对,计算出单应矩阵(H)和基础矩阵(F)的得分
在这里插入图片描述

开辟两个线程,同时计算单应矩阵(H)和基础矩阵(F),获得两个矩阵的得分,后续通过得分比较,来判断使用哪个矩阵进行初始化位姿。
(4) 根据计算出来的单应矩阵和基础矩阵的比分,判断用哪个矩阵进行初始化位姿
在这里插入图片描述

单应矩阵得分越高表示初始化帧的图像偏向平面,
基础矩阵得分越高表示初始化帧的图像偏向非平面。
(5) 使用单应矩阵(H)求的位姿,并且初始化地图点(ReconstructH)
在这里插入图片描述

能计算出8组解,我们对这8组进行验证,并选择产生相机前方最多3D点的解为最优解(通过CheckRT函数进行验证,生成3D点)
(6) 使用基础矩阵(F)求的位姿,并且初始化地图点(ReconstructF)
在这里插入图片描述

从本质矩阵求解两个R解和两个t解,共四组解
分别验证求解的4种R和t的组合,选出最佳组合,若某一组合使恢复得到的3D点位于相机正前方的数量最多,那么该组合就是最佳组合(通过CheckRT函数进行验证)
(7) 通过求得的位姿(R,T),与初始化帧之间的匹配点,进行三角化,求得内点(CheckRT)
在这里插入图片描述

对给出的特征点对及其R t , 通过三角化检查解的有效性,也称为 cheirality check
1、 计算初始化两帧之间的投影矩阵:
在这里插入图片描述

地图初始化时,我们会以初始化帧的第一帧作为我们的世界坐标系,以相机的光心为原点。
2、 遍历所有匹配点,通过投影矩阵进行三角化,获得三角测量后的3D点
在这里插入图片描述

3、 检查三角化的三维点坐标是否合法(非无穷值)
在这里插入图片描述

4、 通过三维点深度值正负、两相机光心视差角大小来检查是否合法
在这里插入图片描述

5、 计算空间点在参考帧和当前帧上的重投影误差,如果大于阈值则舍弃
在这里插入图片描述

将计算出来的3D点通过位姿R、T和相机内参投影到像素坐标上,与图像上的特征点坐标进行计算重投影误差,误差不能超过我们的阈值。我们把不超过阈值这些点称之为内点,超过阈值的点称之为外点
6、 统计经过检验的3D点个数,记录3D点视差角
在这里插入图片描述

7、 得到3D点中较小的视差角,并且转换成为角度制表示
在这里插入图片描述

(8) 记录初始化帧的位姿信息
在这里插入图片描述

(9) 初始化地图点(CreateInitialMapMonocular)
在这里插入图片描述

代码实现如下:
1、 初始化的参考值和当前帧都是关键帧,对这两关键帧进行初始化,并且插入地图中
在这里插入图片描述

2、 用三角化得到的3D点来生成地图点MapPoints
在这里插入图片描述

3、 更新关键帧间的连接关系
在这里插入图片描述

地图点和关键帧之间建立边,每个边有一个权重,边的权重是该关键帧与当前帧公共3D点的个数
4、 全局BA优化,同时优化所有位姿和三维点
在这里插入图片描述

5、 取场景的中值深度,用于尺度归一化
在这里插入图片描述

6、 将两帧之间的变换归一化到平均深度1的尺度下
在这里插入图片描述

7、 把3D点的尺度也归一化到1
在这里插入图片描述

8、 将关键帧插入局部地图,更新归一化后的位姿、局部地图点

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值