「ORB_SLAM2源码解读」之函数ORBmatcher::SearchForInitialization()

fill(mvIniMatches.begin(),mvIniMatches.end(),-1);// 初始化为-1,表示没有任何匹配
// mInitialFrame,mCurrentFrame 初始两帧
// mvbPrevMatched 特征点坐标
// mvIniMatches:index保存是参考帧F1匹配特征点索引,值保存的是匹配好的F2特征点索引
mCurrentFrame.mvpMapPoints[mvIniMatches[i]] = pMP;
mCurrentFrame.mvbOutlier[mvIniMatches[i]] = false;

int nmatches = matcher.SearchForInitialization(mInitialFrame,mCurrentFrame,mvbPrevMatched,mvIniMatches,100);


//校正mvKeys后的特征点
std::vector<cv::KeyPoint> mvKeysUn;
  
// F1中特征点和F2中匹配关系,注意是按照F1特征点数目分配空间
vnMatches12 = vector<int>(F1.mvKeysUn.size(),-1);

// vnMatches12保存参考帧F1和F2匹配关系,index保存是F1对应特征点索引,值保存的是匹配好的F2特征点索引
vnMatches12[i1]=bestIdx2;
vnMatches21[bestIdx2]=i1;

// Update prev matched 将最后通过筛选的匹配好的特征点保存到vbPrevMatched
for(size_t i1=0, iend1=vnMatches12.size(); i1<iend1; i1++)
    if(vnMatches12[i1]>=0)
        vbPrevMatched[i1]=F2.mvKeysUn[vnMatches12[i1]].pt;

C++ STL vector容器详解
Matching for the Map Initialization (only used in the monocular case)
单目初始化中用于两帧的特征点匹配
int SearchForInitialization(Frame &F1, Frame &F2, std::vectorcv::Point2f &vbPrevMatched, std::vector &vnMatches12, int windowSize=10);
Step 1 构建旋转直方图
Step 2 在半径窗口内搜索当前帧F2中所有的候选匹配特征点
Step 3 遍历搜索搜索窗口中的所有潜在的匹配候选点,找到最优的和次优的
Step 4 对最优次优结果进行检查,满足阈值、最优/次优比例,删除重复匹配
Step 5 计算匹配点旋转角度差所在的直方图
Step 6 筛除旋转直方图中“非主流”部分
Step 7 将最后通过筛选的匹配好的特征点保存
in F1 初始化参考帧
in F2 当前帧
in & out vbPrevMatched 本来存储的是参考帧的所有特征点坐标,该函数更新为匹配好的当前帧的特征点坐标
in & out vnMatches12 保存参考帧F1中特征点是否匹配上,index保存是F1对应特征点索引,值保存的是匹配好的F2特征点索引
in windowSize 搜索窗口
return int 返回成功匹配的特征点数目

你可能感兴趣的:(从零开始学习SLAM)