Hi my new friend!

vins回环检测

  • Home
  • vins回环检测
Scroll down

研究背景

在使用Mast3r进行三维重建的时候,原始方法是对n张图片通过n*(n-1)的复杂度进行遍历匹配,但是这种方法太费时:50张图需要2450次匹配,单次匹配需要0.3秒(Nvidia RTX 3060),共计需要12分钟。

当手动选取具有共视区的图像对时,只选取了241组配对图片,只需要1.2分钟即可匹配完成,因此根据共视区选取图像对的方法,可以大大减少匹配时间。

回环检测

在当前的研究中,可以完成共视区计算的算法主要应用与SLAM的回环检测中,回环检测是SLAM中的一个重要环节,它可以提高地图的一致性,减少累积误差,提高定位的精度。常用算法有ORB、VINS等。

因此可以选用VINS的回环检测算法,通过计算共视区,选取具有共视区的图像对,减少匹配时间。

VINS回环检测

VINS回环检测的主要流程如下:

  1. 利用DBoW2进行回环检测。
  2. 除了用于单目VIO的角点特征外,还添加了500个角点并使用BRIEF描述子描述。额外的角点特征用于在回环检测中实现更好的召回率。
  3. DBoW2在时间和空间一致性检查后返回回环检测候选帧。
  4. VINS保留所有用于特征检索的BRIEF描述子,丢弃原始图像以减少内存消耗。
  5. 检测到回环时,通过BRIEF描述子匹配找到对应关系,建立局部滑动窗口与回环候选帧之间的连接。

算法流程图为:
alt text

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; // corner detector response threshold
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);
}
}

我是学生,给我钱

其他文章
nerfstudio
  • 24/09/20
  • 14:38
目录导航 置顶
  1. 1. 研究背景
  2. 2. 回环检测
  3. 3. VINS回环检测
    1. 3.1. DBoW2
请输入关键词进行搜索