SVO中的逆光流法:inverse compositional Lucas-Kanade algorithm

文章详细介绍了逆向光流法在解决光流问题中的优势,主要是通过在参考图像的固定点进行泰勒展开,减少了雅格比和Hessian矩阵的重复计算,降低了计算复杂度。这种方法相较于常规光流法,能更有效地处理图像匹配和变换问题。
摘要由CSDN通过智能技术生成

参考链接

SVO中 Inverse Compositional Image Alignment方法的学习笔记(https://blog.csdn.net/Armergg/article/details/106567744)

逆向光流法出处:Lucas-Kanade 20 Years On: A Unifying Framework(https://www.cs.cmu.edu/afs/cs/academic/class/15385-s12/www/lec_slides/Baker&Matthews.pdf),太长不看系列

总体上讲,逆光流法的优势主要体现在gauss-newton求解过程中的雅格比和Hessian矩阵计算上,对于常规gauss-newton在迭代过程中是不断对自变量x在目标图像中的位置处进行泰勒展开,因为每次展开点都不一样所以每次迭代都需要重新求导计算雅格比和Hessian矩阵等。

根据逆光流法采取的策略是每次都在参考图像的同一位置处展开,这样就避免了求导等操作的反复进行。

光流法中的最小二乘问题

光流法是根据光度不变性假设(同一空间点在各图像上的成像点的灰度值相同)实现,也就是下面的式子:
在这里插入图片描述

这个公式的物理意义是参考图像T中某个点x经过一个坐标变换p得到x’,在当前帧I图像x’坐标处的像素灰度和图像T的x处像素灰度值相同。

式中T(x)表示参考图象中点x的像素灰度值。W表示关于x和p的一个函数,W(x;p)表示x点坐标经过变换(变换可以是纯平移或仿射)后的坐标。p是一个参数向量,用于构建相关的变换。I(.)表示当前图像中某点的像素灰度值。最终通过调整p的取值来使上述公式成立。

式(1)只针对一个点,但在实际中会考虑多个点对p的求解约束。因此一般的光流法求解的是下面这样的一个式子:
在这里插入图片描述

这是求出p关于式(2)的最小二乘解的过程,可由迭代的方法解决(如高斯牛顿法)。对于式(2)来说,p和W(.)的更新公式为(这些更新公式不难理解,就是对p和W(.)进行的一种简单叠加):
在这里插入图片描述

迭代求解不可避免地要对原公式进行求导。先对式(2)求在I(W(x;p+△p))处的一阶泰勒展开:
在这里插入图片描述

式中的▽I(W)是I图像中W(x;p)像素坐标点处的像素梯度,它与当前像素坐标有关,也就是和p有关。同时W关于p的雅可比矩阵也与p的当前值有关。所以上述方法需要在每次迭代优化后求一次新的导数。之后就是通过构建Hessian矩阵来求出△p增量,完成迭代求解操作。大致步骤如下图:
在这里插入图片描述

做一个小小的总结: 可以看到上述在构建好损失函数后就是一个基于高斯牛顿法解最小二乘的过程,基于参考帧处x的坐标,不断地迭代变换p在当前帧寻找新的匹配点x’,在这个不断迭代过程中是在当前帧新的点x’处进行更新的,每次更新都需要计算相应的雅格比矩阵和Hessian矩阵,这一过程浪费了很多计算资源的消耗,逆向光流法就是针对这一现象提出的。

逆向光流法中的最小二乘问题

逆向光流法也是基于灰度不变性假设实现,但它求解的迭代优化问题不同。它求解的目标是下面这个式子:
在这里插入图片描述

与式子(2)相比,式(6)中图象T和I换了个位置。△p的作用对象从图像I变成了图像T(这应该是算法被称为逆向光流的原因吧)。此时,W(.)的更新公式变成了:
在这里插入图片描述

下面谈谈我对公式(7)的理解。首先在两张图T、I中标记出正在进行匹配两个点对,将它们分别记为Pt和Pi。由于两幅图像目前估计的仿射变换为W(x;p),所以我们可以用下图来表示当前的情况:
在这里插入图片描述

这时我们在图像T中进行一次微调,也就是对Pt执行W(x;△p)操作,将变换后的点记为Pt’。此时情况如下图所示:
在这里插入图片描述

我们假设经过这次△p的更新之后, Pt’ 与Pi之间的灰度误差最小,可认为 Pt’ 就是Pi对应的匹配点。得,弄了半天找了个 Pt’ 的匹配点。不过没有关系,至少我们知道Pi不会是Pt的匹配点。因此要在图像I中继续搜索,即移动Pi的位置,获得新的点Pi’。怎么移呢?我们这样想,既然 Pt’ 是通过△p变换获得的,那么对Pi使用与△p方向相反的变换(从这儿可以看出逆向光流法的限制是需要W(.;△p)是可逆的!)就有可能获得与Pt匹配的点。这一步由式(9)来实现,情况如下图所示:
在这里插入图片描述

那么这样的方法有什么好处呢?我们先对式(8)进行一阶泰勒展开,从展开式中就能够看出这个方法的优势:
在这里插入图片描述

式中的▽T代表的是W(x;0)点处的像素梯度,它是一个固定的量。W关于p的雅可比矩阵是在(x;0)处求得的(这就说明p对雅可比的计算是没有影响的),也是个固定量。之后就是通过构建Hessian矩阵来求出△p增量,完成迭代求解操作。大致步骤如下图:
在这里插入图片描述

从图中可以看出,由于有些量在整个迭代过程中是固定的,所以能够在算法的一开始就计算出来它们的值,且在迭代过程中可以一直使用,不需要更新。这固定的量就是降低整个算法计算量的关键所在。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于代码实现的篇幅较长,这里只介绍各算法的代码实现思路,具体实现方式可以参考相关文献和代码库。 1. SVO 算法的代码实现思路: SVO 算法的代码实现可以分为以下几个步骤: - 特征提取和匹配:使用 FAST 特征检测器和 FREAK 描述子提取图像的特征点和描述子,并对左右图像的特征点进行匹配。 - 光流估计:使用 Lucas-Kanade 光流法对相邻两帧图像的特征点进行跟踪,估计其在当前帧的位置。 - 深度估计:使用 PatchMatch 算法对左右图像的特征点进行深度估计,得到稠密的深度图。 - 位姿估计:使用 PnP 算法和 RANSAC 方法对当前帧的位姿进行估计。 - 重建点云:使用三角化算法对左右图像的匹配点进行三角化,得到三维点云。 - 优化:使用非线性优化方法对位姿和深度进行优化,得到更精确的估计结果。 2. DSO 算法的代码实现思路: DSO 算法的代码实现可以分为以下几个步骤: - 特征提取和匹配:使用 FAST 特征检测器和 BRIEF 描述子提取图像的特征点和描述子,并对左右图像的特征点进行匹配。 - 光流估计:使用金字塔光流法对相邻两帧图像的特征点进行跟踪,估计其在当前帧的位置。 - 直接法匹配:使用直接法对相邻两帧图像的像素值进行匹配,得到稀疏的深度图。 - 位姿估计:使用 PnP 算法和 RANSAC 方法对当前帧的位姿进行估计。 - 重建点云:使用三角化算法对左右图像的匹配点进行三角化,得到三维点云。 - 优化:使用非线性优化方法对位姿和深度进行优化,得到更精确的估计结果。 3. LSD-SLAM 算法的代码实现思路: LSD-SLAM 算法的代码实现可以分为以下几个步骤: - 特征提取和匹配:使用尺度空间极值检测器和 SIFT 描述子提取图像的特征点和描述子,并对左右图像的特征点进行匹配。 - 光流估计:使用金字塔光流法对相邻两帧图像的特征点进行跟踪,估计其在当前帧的位置。 - 深度估计:使用半稠密深度估计算法对左右图像的像素点进行深度估计,得到半稠密的深度图。 - 位姿估计:使用 PnP 算法和 RANSAC 方法对当前帧的位姿进行估计。 - 重建点云:使用三角化算法对左右图像的匹配点进行三角化,得到三维点云。 - 优化:使用非线性优化方法对位姿和深度进行优化,得到更精确的估计结果。 需要注意的是,各算法的具体实现方式可能有所不同,而且在实际应用还需要考虑多种因素,如噪声、遮挡、动态物体等,因此需要综合考虑算法的精度、效率和鲁棒性等因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值