研究背景
在使用Mast3r进行三维重建的时候,原始方法是对n张图片通过n*(n-1)的复杂度进行遍历匹配,但是这种方法太费时:50张图需要2450次匹配,单次匹配需要0.3秒(Nvidia RTX 3060),共计需要12分钟。
当手动选取具有共视区的图像对时,只选取了241组配对图片,只需要1.2分钟即可匹配完成,因此根据共视区选取图像对的方法,可以大大减少匹配时间。
回环检测
在当前的研究中,可以完成共视区计算的算法主要应用与SLAM的回环检测中,回环检测是SLAM中的一个重要环节,它可以提高地图的一致性,减少累积误差,提高定位的精度。常用算法有ORB、VINS等。
因此可以选用VINS的回环检测算法,通过计算共视区,选取具有共视区的图像对,减少匹配时间。
VINS回环检测
VINS回环检测的主要流程如下:
- 利用DBoW2进行回环检测。
- 除了用于单目VIO的角点特征外,还添加了500个角点并使用BRIEF描述子描述。额外的角点特征用于在回环检测中实现更好的召回率。
- DBoW2在时间和空间一致性检查后返回回环检测候选帧。
- VINS保留所有用于特征检索的BRIEF描述子,丢弃原始图像以减少内存消耗。
- 检测到回环时,通过BRIEF描述子匹配找到对应关系,建立局部滑动窗口与回环候选帧之间的连接。
算法流程图为:
DBoW2
DBoW2是一个用于图像检索的库,它可以用于回环检测。
代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| void KeyFrame::computeWindowBRIEFPoint() { BriefExtractor extractor(BRIEF_PATTERN_FILE.c_str()); for(int i = 0; i < (int)point_2d_uv.size(); i++) { cv::KeyPoint key; key.pt = point_2d_uv[i]; window_keypoints.push_back(key); } extractor(image, window_keypoints, window_brief_descriptors); }
void KeyFrame::computeBRIEFPoint() { BriefExtractor extractor(BRIEF_PATTERN_FILE.c_str()); const int fast_th = 20; if(1) cv::FAST(image, keypoints, fast_th, true); else { vector<cv::Point2f> tmp_pts; cv::goodFeaturesToTrack(image, tmp_pts, 500, 0.01, 10); for(int i = 0; i < (int)tmp_pts.size(); i++) { cv::KeyPoint key; key.pt = tmp_pts[i]; keypoints.push_back(key); } } extractor(image, keypoints, brief_descriptors); for (int i = 0; i < (int)keypoints.size(); i++) { Eigen::Vector3d tmp_p; m_camera->liftProjective(Eigen::Vector2d(keypoints[i].pt.x, keypoints[i].pt.y), tmp_p); cv::KeyPoint tmp_norm; tmp_norm.pt = cv::Point2f(tmp_p.x()/tmp_p.z(), tmp_p.y()/tmp_p.z()); keypoints_norm.push_back(tmp_norm); } }
|