ORBSLAM源码理论分析2—单目初始化
1.构造初始化帧1
1.通过特征点提取得到关键点和描述子(mDescriptors),此部分参考文章《ORBSLAM源码理论分析1—特征点提取》,然后对关键点进行矫正,得到矫正的关键点(mvKeysUn)。帧1的关键点记为mvKeys1。
2.构造地图点(mvpMapPoints)。地图点mvpMapPoints.size与关键点mvKeys1.size相同,此时地图点指针为NULL,即地图点为空。
3.计算图片畸变矫正之后的边界mnMinX、mnMaxX、mnMinY、mnMaxY。计算每个小网格的宽高的倒数mfGridElementWidthInv、mfGridElementWidthInv。这里的小网格是人为将图片划分的,一共有48 × \times × 64个,将用于特征匹配。得到相机的内参。
第3步只在初始化构造帧1时执行,构造后续帧时不再有此步骤。
4.得到帧1的唯一身份识别mnId。
5.得到图像金字塔的相关参数,mnScaleLevels、mfScaleFactor、mvScaleFactors、mvLevelSigma2、mvInvLevelSigma2。
6.给48 × \times × 64个小网格mGrid[i][j]分配特征点。特征点的像素坐标在哪个网格中,则特征点属于哪个网格。
7.构造外点(mvbOutlier),外点mvbOutlier.size与关键点mvKeys1.size相同,此时外点都为false。即此时认为所有关键点都为内点。
2.第一次初始化
如果帧1的关键点mvKeys1.size < 100则输入新图片,重新构造初始化帧1。如果帧1的关键点mvKeys1.size > 100则继续往下执行。
1.将帧1构造为mInitialFrame和mLastFrame,即帧1 = mInitialFrame = mLastFrame
2.帧1预备参与特征匹配的点为所有特征点,所以mvbPrevMatched.size与帧1的关键点mvKeys1.size完全相同,并且存储的内容为帧1关键点mvKeys1的像素坐标(pt)。
3.通过当前帧构造初始化器mpInitializer。设置一些参数,将服务于计算基础矩阵和单应矩阵。
3.构造初始化帧2
与构造初始化帧1相似,除了步骤3外,其它步骤都执行。帧2的关键点记为mvKeys2,帧2就是mCurrentFrame。另外,为了陈述方便,在下文中帧1可记为F1, 帧2可记为F2。
4.F1与F2特征匹配
如果F2的关键点mvKeys2.size ⩽ \leqslant ⩽ 100则,输入新图片,重新构造初始化F1。如果F2的关键点mvKeys2.size > 100则,继续往下执行。
F1与F2开始特征匹配,遍历F1的关键点mvKeys1,在F2中寻找图像金字塔第0层的匹配点。以F1金字塔第0层中的一个特征点kp1为例讲解具体匹配过程。
我们拿到了特征点kp1,根据kp1的像素坐标,比如kp1像素坐标为(20,30),找到F2中对应位置的像素点(20,30),如下图所示,红色的像素点即为此点。
帧2搜索区域示意
程序中的windowSize为100,表示以红色的像素点为中心,边长为2 × \times × 100的虚线框区域。为什么有个比虚线框大的红色实线框呢?下面解释一下。
因为我们搜寻kp1在F2中的候选匹配点时,最小搜寻单位是一个小网格,所以虽然根据windowSize实际计算出来的搜寻区域是虚线框,我们也要扩大搜寻区域,使搜寻区域包含整数个小网格。这个扩大的搜寻区域就是红色实线框。请记住虽然搜寻区域为红色实线框,但我们选取的候选匹配点都在虚线框内,超过虚线框的特征点将被直接丢弃。另外,候选匹配点有很多,匹配点有可能会在这里面诞生。
在kp1的候选匹配点中,选取描述子与kp1描述子距离最小和次小的两个点,距离分别记为bestDist和bestDist2,距离最小的那个点可能是kp1在F2中的匹配点。
对F1图像金字塔第0层中所有特征点进行如是操作,找出F2图像金字塔第0层中的可能匹配点。那么这些可能的匹配点中,哪些是匹配点,哪些是误匹配呢?下面给出判断的条件。
(1)最小距离bestDist < th,th为一个阈值,即最小距离小于阈值。
(2)bestDist < 0.9 × \times × bestDist2,即最小距离明显小于次小距离。
(3)大多数可能的匹配点对的方向角差值在同一个范围内。
满足上述三个条件的可能的匹配点对就是F1与F2的匹配点对,匹配成功的数量记为nmatches。这些匹配点对的索引存储在容器mvIniMatches中,mvIniMatches.size与F1的mvKeys1.size相同,F1与F2匹配上的点对表示为,
mvIniMatches[i1]=i2;
i1是F1中特征点在mvKeys1中的索引,i2是F2中特征点在mvKeys2中的索引。mvIniMatches[i1]的值还可以表示为,