最近空闲时间在研究Semi-Direct Monocular Visual Odometry(SVO)[1,2],觉得它值得写一写。另外,SVO的运算量相对较小,我想在手机上尝试实现它。
关于SVO的介绍,有两篇博客介绍得非常好,因此我这里只简单提一下大概的思路,重点讲解了一下深度滤波器的原理。
svo: semi-direct visual odometry 论文解析
姿态估计
估计初始姿态
利用相邻两帧之间的特征点对,计算相对位姿。
计算第k
最近空闲时间在研究Semi-Direct Monocular Visual Odometry(SVO)[1,2],觉得它值得写一写。另外,SVO的运算量相对较小,我想在手机上尝试实现它。
关于SVO的介绍,有两篇博客介绍得非常好,因此我这里只简单提一下大概的思路,重点讲解了一下深度滤波器的原理。
svo: semi-direct visual odometry 论文解析
利用相邻两帧之间的特征点对,计算相对位姿。
计算第k
帧时深度已知的地图点(3D)在两帧中的投影点(2D)。特征点patch是特征点周围4×4的区域。
利用Gauss-Newton迭代法求解 T̂ k,k−1 。给k−1
帧加一个小扰动 δ ,通过灰度差优化 δ。这步叫Inverse compositional formulation。
T̂ k,k−1←T̂ k,k−1⋅T(δ)−1
这一步忽略patch的变形,不做warping。因为相邻帧之间的形变很小。
Inverse compositional formulation保证Jacobian在迭代中保持不变,因此可以预先计算,降低计算量。
关于文章中导数的求解,请参考高博的直接法,非常详细。参考文献见[3]。
利用初始位姿,寻找更多的地图点(3D)到当前帧投影点(2D)的对应关系。
对每个当前帧能观察到的地图点p
(已经收敛的深度估计),找到观察 p 角度最小的关键帧 r 上的对应点 ui ,优化得到 p 在当前帧上的投影 u′i。优化的目标函数是仿射变换下的灰度差。
这一步中的patch采用的是8×8邻域,Ai
表示一个仿射变换。这步不考虑极线约束,因为此时的位姿还是不准确的。第二步和第三步需要一定量的地图点,不能在一开始就使用,猜测这是作者强调深度估计收敛快的原因之一。
利用第二步建立起的(pi,ui)
的对应关系,优化世界坐标系下的位姿 Tk,w ,标准motion only bundle adjustment。这里 pi是世界坐标系下的3D坐标。
根据文章图11,BA优化前投影误差均值为0.3 pixel左右,优化后均值降低了一点点,误差曲线更稳定了。也许是这个原因,作者在程序中提供了一个选项忽略这步。
当出现新的关键帧r
时,作者在 r上选取若干特征点(即seed),每个特征点对应一个深度估计,其初值为该帧的平均深度,并被赋予极大的不确定性。
后续帧{Ik,Tk,w}
对它能观测到的seed的深度估计产生贡献。具体而言,对 r 上深度还没有确定的点 {p,u} ,根据 Tk,r 找到 p 对应的极线 LP ,在极线上寻找和 u 最相似的点 u′ ,通过三角测量计算得到深度 x 及不确定性 τ ,然后利用贝叶斯概率模型更新 p 点的估计。当 p的深度估计收敛时,计算其三维坐标,并加入地图。
以下内容来源于参考文献[4]
G. Vogiatzis and C. Hern´ andez, “Video-based, Real-Time Multi View Stereo,” Image and Vision Computing, vol. 29, no. 7, 2011.
给定已知相对位姿的两个视角下的图像I,I′
。由两幅图像中的对应点及位姿可以计算得到一个深度值 x 。由于重建误差和误匹配的存在,考察实际情况中 x 的直方图分布,[4]作者认为, x 的分布可以用高斯分布和均匀分布来联合表示轴表示直方图统计。
考虑同一个seed的一系列测量x1,x2,...,xn
,假设这些测量是独立的。我们想从 (1) 式求出 Z,π 。最直观的做法是通过最大似然估计求解。然而[4]作者认为最大似然估计容易被局部极大值干扰,其结果并不准确。[4]作者选择从最大后验概率求解,等价于
并给出一个迭代格式
小于给定阈值时,认为seed的深度估计已经收敛,计算其三维坐标,并加入地图。
[4]作者提供了文档给出了上面推导过程的证明。文档的名字为“Supplementary matterial Parametric approximation to posterior”。这里首先假设p(Z,π)
满足独立性公式
第二步:估计后验概率。令

被折叠的 条评论
为什么被折叠?
