[Tutorial]综述阅读笔记 <Visual Odometry PartII_Introduce about BA>

Visual Odometry: Part II - Matching, Robustness, and Applications ---- paper notes

https://www.zora.uzh.ch/id/eprint/71030/1/Fraundorfer_Scaramuzza_Visual_odometry.pdf

特征点的选择与匹配

特征点匹配的两类方法

  • 在一张图中提取特征点,在另一张图中用局部搜索的方法跟踪上一张图的特征点

  • 两张图各自提取特征点,比较这些特征点的描述子的相似性

  • 第一个方法适用于相机移动比较小,视角变化较少时;第二个方法适用于相机大幅度运动时。最近比较常用的是第二个方法,因为第一个方法认为相机是在小范围的环境中(small-scale environment)拍摄;而当前的应用大多是在大范围的环境中(large-scale environment)

检测特征点

大致分为角点检测器Corner Detectors 、斑点检测器Blob Detectors ,corner detectors (e.g., Moravec , Forstner, Harris, Shi-Tomasi, and FAST) and blob detectors (SIFT , SURF , and CENSUR )

  • 角点容易被检测到但辨识度较差 less distinctive,斑点辨识度高但检测速度比较慢
  • 角点比斑点更容易在图片中定位,但角点难以应对尺度的变化(比如缩小图片则可能很难准确定位到角点)

检测特征点一般分为两个阶段

  • 首先将特征响应函数应用到整幅图

  • 其次使用非最大值抑制来过滤输出

如何使特征点具有尺度不变性? 一般是将一幅图的大尺度版本和小尺度版本都分别输入到检测器中

如何使特征点能应对视角的变换?一般是将视角畸变为affine 的程度

The trick to make a detector invariant to scale changes consits in applying the detector at lower-scale and upper-scale versions of the same image. Invariance to perspective changes is instead attained by approximating the perspective distortion as an affine one

特征描述子

最简单的特征描述子是外观,也就是特征点周围像素的密度,然而它无法应对方向、尺度、视角的变换。最常用的描述子之一是SIFT,也就是特征点周围区域的梯度方向的直方图。

发展历史 SIFT->SURF->BRIEF->ORB

特征(描述子)匹配

在两张图中分别检测特征 计算描述子,然后比较两幅图的各自描述子的相似性

  • 可能会使得第二张图中的一个特征对应于第一张图的多个,可以使用互相一致性检查来避免
  • 这种穷尽的匹配方式代价比较高,可以使用索引类型的数据结构改善,更快的方法是直接搜索第二张图中可能的对应区域,比如使用某种运动模型来预测可能的对应区域

移除局外点

匹配点中可能存在局外点,也就是错误的匹配。可能造成的原因比如图像噪声,遮挡,模糊,视角变换、光照的影响等等。因此需要利用运动模型的几何约束来移除局外点。RANSAC已经成为这方面的标准算法。

RANSAC的思想在于从数据点中随机采样子集,估计出一个假设的模型,然后用其它的点来验证这个模型,能够与其它数据达成最大一致的模型则认为是最终模型。

对于两帧VO的运动估计来说,需要估计的模型是两帧之间相机的变换矩阵(R, t),数据点则是候选的匹配特征点对

相机姿态优化

姿态图优化 Pose-Graph Optimization

将VO中计算得到的相机姿态,表示为姿态图:

  • 图节点为相机姿态

  • 图的边为相机之间的姿态变换(不同帧之间的)

边约束为

\[\sum_{e_{ij}} ||C_i-T_{e_{ij}}C_j||^2 \]

其中,\(T_{e_{ij}}\) 是姿态之间的变换矩阵

  • 变换矩阵中的旋转矩阵部分,使得损失函数是非线性的

  • 因此需要用非线性优化算法来求解。

回环,为距离较远的帧(的相机姿态)之间建立了边约束。

回环检测通常是用视觉词袋来计算图片之间的相似性,判断是否存在回环。

  • 若找到相似较高的图片 则用几何约束来验证(比如是否符合对极约束)是否匹配

    • 若符合,则基于两张图之间的匹配点 (此时匹配的阈值可以稍微放宽限制 因为距离较长可能带来很多误差累计),估计二者的刚体变换,将其添加到姿态图中继续优化。
      \
      \

局部(窗口Windowed)BA

\
与姿态图优化类似,但是BA还考虑了3D路标点的优化。称为局部或窗口是因为一次性考虑n帧图像,然后对相机姿态和路标点进行参数优化。优化目的是找到最优的相机姿态和路标点,使得重投影误差最小化:

\[\arg \min _{X^i, C_k} \sum_{i, k} ||p_k^i - g(X^i, C_k) ||^2 \]

\
其中 \(p_k^i\) 是3D路标点 \(X^i\) 在第 \(k\)图像中的第 \(i\) 个观测点,\(g(X^i, C_k)\) 是路标点 \(X^i\) 在相机姿态\(C_k\)下的重投影

观测点是怎么得到的?路标点是怎么优化的?

  • 对于2D 的情况,即没有深度信息。首先做帧间特征点匹配,计算出初始的帧间变换矩阵T;其次使用三角化估计出2D图像对应的3D点,作为路标点,将路标点投影到第三帧的图像,计算重投影误差,来优化姿态和路标点。

    • 为什么需要优化路标点?因为如果不优化,则认为三角化是完全准确的,但由于姿态也是估计的 不一定准。。因此会影响三角化的结果,使得路标点未必准确

好处?

  • 相比2帧的VO来说减少了很多运动飘移drift,相机姿态和路标点之间也会有边连接(也就是存在变换关系),而图像的特征跟踪不只是来自之前的相机姿态,也有来自将来的相机姿态回来(是因为回环的关系吗?)

\
\

Bundle Adjustment https://blog.csdn.net/OptSolution/article/details/64442962

本质上是个优化模型,目的是最小化重投影误差(通过优化相机姿态等一些变量的计算来达到)

posted @ 2019-09-21 22:47  lunaY  阅读(537)  评论(0编辑  收藏  举报