目录
- Visual Odometry: Part II - Matching, Robustness, and Applications ---- paper notes
- 特征点的选择与匹配
- 特征点匹配的两类方法
- 检测特征点
- 移除局外点
- 相机姿态优化
- 姿态图优化 Pose-Graph Optimization
- 局部(窗口Windowed)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
本质上是个优化模型,目的是最小化重投影误差(通过优化相机姿态等一些变量的计算来达到)