欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-24 23:44:16
...
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 返回成功匹配的特征点数目

上一篇: torch.nn.LSTM()

下一篇: nn.LSTM备忘