OpenVINS系统中,视觉特征的提取与跟踪主要分为两种,一种是基于ORB特征(先提取,后匹配),另外一种是基于KLT光流跟踪(先提取fast点,后进行KLT光流跟踪)。此外,系统也提供了对标记物和模拟数据的处理。这一部分的代码在ov_core/src/track文件夹中。

一.基于KLT光流的特征跟踪
1.特征提取

在特征提取过程中,首先将图片划分为小的网格,在每个网格中提取一定数目的特征点(保证特征的均匀分布)。系统提供了两种特征提取方法:第一种是提取Difference of Gaussian (DoG)特征,但这种方法在系统中并未使用。第二种是在网格中提取FAST点,值得学习的是,作者使用函数cv::parallel_for_在网格中并行提取fast点,提高了特征提取的速度。
单目图像:当处理第一帧图像时,直接进行特征提取,而第二帧图像,只需补充特定数量(目标数量-当前数量)的特征点。OpenVINS采取的策略是:在第二帧之后的图像上,依旧在整幅图像上进行特征提取,在加入的过程中,同样设置网格来判断该网格是否需要加入特征点(如果该网格中存在特征点,则不新增,否则将新提取的特征点加入到系统中)。
双目图像:不同于单目图像,双目图像多了左右图像上特征匹配的这一步骤。OpenVINS系统中,首先在左图上进行特征提取,之后再利用KLT光流跟踪方法在右图寻找对应关系。右图对应的特征与左图特征设置相同的id。之后左图和右图分别补充按照单目图像的模式来新增特征。
2.特征跟踪
特征跟踪阶段,利用OpenCV库中的KLT光流跟踪函数cv::calcOpticalFlowPyrLK来进行特征跟踪,之后利用去畸变后的特征(cv::undistort_point_brown)来进行RANSAC来去除外点。特别的,对于双目图像,分别在左图和右图上进行KLT跟踪。系统没有使用从左图到右图的跟踪(TODO内容)。
二.ORB特征提取与匹配(基于描述子)
1.ORB特征提取
ORB提取时,fast特征点的检测使用了系统自己实现的网格化均匀提取方法(第一节中)。特殊的,在处理双目图像时,左右两幅图像首先进行特征匹配,保留匹配成功的特征(成对的特征)。
2.ORB特征匹配
好的特征匹配三个筛选标准:
- 最优匹配距离/次优匹配距离 < 设定阈值(最优距离显著小于其他的匹配)
- 图1-图2 与 图2-图1匹配结果相同(对称检查)
- 极线约束(满足极线约束)
三.基于标记物(OpenCV Aruco)
使用的OpenCV Aruco 格式为cv::aruco::DICT_6X6_25。FeatureDatabase存储了检测到的marker的第一个角点。
四.模拟数据处理
在特征跟踪部分,将生成的模拟数据加入到featuredatabase数据库中。