运动估计算法的程序实现_DeepFlow高效的光流匹配算法(上)

 本周主要介绍一篇基于传统光流法而改进的实现快速的稠密光流算法。该算法已经集成到OpenCV中,算法介绍网址:http://lear.inrialpes.fr/src/deepmatching/

在介绍该高效的算法之前,我们先介绍一下经典的LK光流算法,所以这篇文章将分为上下两篇。 第一篇主要介绍光流算法的基础知识,以及理论推导。 第二篇将介绍改进的稠密光流算法匹配算法DeepFlow,并展示windows下OpenCV中集成代码和在linux下源码的运行效果。

光流算法基础 光流(Optical Flow)是目前运动图像分析的重要方法,它的概念是由 James J. Gibson于20世纪40年代首先提出的,是空间运动物体在观察成像平面上的像素运动的瞬时速度。这种运动模式是有一个观察者在一个视角下,评估两幅图像之间的变形。

光流计算基于物体移动的光学特性提出2个假设 (1)亮度恒定不变,就是同一点随着时间的变化,其亮度不会发生改变。这是基本光流法的假定(所有光流法变种都必须满足),用于得到光流法基本方程; (2)时间连续性或者运动时小运动,这个也必须满足,就是时间的变化不会引起位置的剧烈变化,这样灰度才能对位置求偏导(换句话说,小运动情况下我们才能用前后帧之间单位位置变化引起的灰度变化去近似灰度对位置的偏导数),这也是光流法不可或缺的假定; 首先我们需要对光流有一个基本认识:

7f178c72cf35a049938ecfc96b4db05f.png

连续帧的图像

940221fc615b01c170de0665b7109f8d.png

特征点(角点)提取

986be5789cdfc81138e6d8da2d43f669.png

特征点跟踪

b89296afe41020031c0d31ac43f682d2.png

光流跟踪效果图

在基于以上的前提下,我们假设有两帧图像,如下点(x,y)经过(u,v)的位移对应第二帧图像上的(x+u,y+v)

55d14d243684fd8052a743c88410042f.png

Ix和Iy就是该点在x轴方向上和y方向的导数。It是该点对时间的求导,在极小时间内图像亮度恒定的条件下It为两帧图像上灰度值之差。因此有公式(4)

cb2a544d380c2872fa650d94f5d28c66.png

这就就是基本的光流约束条件,Ix,Iy,It均可由图像数据求得,而(u,v)即为所求光流矢量。但是光流的约束方程只有一个,而需要求出x,y方向的速度u和v(两个未知量),一个方程两个未知量是没有办法求解的,所以下文介绍的LK光流法考虑到了像素点的领域,将问题转变成了计算这些点集的光流,联立多个方程,从而解决这个问题。

LK光流

LK( Lucas–Kanade )光流算法是一种两帧差分的光流估计算法。它由Bruce D. Lucas 和 Takeo Kanade提出。 光流分为稠密光流法和稀疏光流法,稀疏光流主要是跟踪特征点,稠密光流是跟踪图像中的每个像素,由这篇文章延伸出来的下篇文章DeepFlow就是稠密光流中目前为止最为高效的稠密光流算法。 LK光流算法加了一个更加严格的条件---空间一致性,一个场景上邻近的点投影到图像上也是邻近点,且邻近点速度一致。这是Lucas-Kanade光流法特有的假定,因为光流法基本方程约束只有一个,而要求x,y方向的速度,有两个未知变量。我们假定特征点邻域内做相似运动,就可以联立n多个方程求取x,y方向的速度(n为特征点邻域总点数,包括该特征点)。

领域内光流一致,一个场景中的同一个表面的局部领域内具有相似的运动,在图像平面上的投影也在邻域区域,且临近点速度一致,认为邻域内所有像素点的运动一致的,这是LK光流特有的假定。 具体到图像中,所以下图所示,Wx,Wy是块区域的大小。

c2a848f980604b95eb483cad9f1dea82.png

根据以上的区域灰度值不变且邻域内的所有像素点运动一致的。可以得出以下

be6e5fdd77d4f1ede96241bb9adeb69f.png

该方程中只有两个未知数,u和v,却有n个方程也是不合理的,说明这个方程中也有多余的,怎么样才能得到最优解呢?可以将上式整理为

3e17fd4bdb55abb88cdf0f8bc0fb3362.png

简单写为,其中A是在x,y方向上导数,x为要求的u和v向量。

78f9625f677d89cd8f90490fdce959bd.png

最终得出

37bfdd5f9780db2fe86f900c05ec4029.png

所以这里我们列出了这些方程的残差函数

7c00cfb3f6aaebe2ef9da405c59cdf4c.png

那么最终只需要求得到该残差方程的偏移量最小,也就是使用了最小二乘法求出这个方程组的最优解。

上面提到了LK光流的假定是小运动,可是运动较快的时候应该怎么办呢?考虑到两帧之间的物体的位移比较大,且运动快速时,算法会出现较大的误差,那么就希望减少图像中物体的运动位移,怎么做的?那就要缩小图像的尺寸,假设当图像为400400,物体的位移为【16,16】那么当图像缩小为200200位移就变成了[8,8] 缩小为100*100 位移缩小为[4,4],所以在原图像缩放了很多以后,LK光流法又变得适用了。所以LK光流引入了图像金字塔,上层金字塔(低分辨率)中的一个像素可以代表下层的两个像素,这样利用金字塔的结构,将图像逐层的分解,自上而下修正的运动量。

加入图像金字塔光流的计算

(1)图像金字塔,首先对每一帧图像建立一个高斯金字塔,最低分辨率图像在最顶层,原始图像在底层。

7de923327a9f2b8257229e2654e9b4f0.png

e250ae928baacddb8a91bd7b17de23d2.png

(2)计算光流使用顶层(Lm)层开始,通过最小化每个点领域范围内的匹配误差和,得到每个顶层图像中每个点的光流。该步骤主要是求解上述的残差函数,不再赘述。 假设图像的尺寸每次缩放为原来的一半,一共缩放了Lm层,则第0层为原始图像,设已知原图的位移为d,则每一层的位移可以表示为

20e9d044175d574d970d8bbef1d1babf.png

所以顶层的光流计算结果,也就是位移,反应到Lm-1层,作为该层初始时的光流值的估计g表示为:

d5b7f54d9ecaa873d8465b0e61bfb9f7.png

沿着金字塔向下反馈,重复估计每一层的位移,直到最底层也就是原始图像计算像素的位移:

2217f5cab1b1e4062edac9a832e4cffb.png

可以理解为 准确值=估计值+残差,对于每一层L,每个点的光流的计算都是基于邻域内所有点的匹配误差和最小化

这样的搜索方式,不仅可以解决大运动目标跟踪,也可以在一定程度上解决孔径问题(相同大小的窗口能覆盖大尺度图片上尽可能多的角点,而这些角点无法在原始图像上被覆盖)由于金字塔的缩放减小了物体的位移,也就减小了光流,其中顶层图像中的光流的估计值设置为0

997138bd839c28c6671f68d5f023eb48.png

光流残差方程推导

求解光流最重要的是最小化上文提到的残差方程:

3d496c0e17b5c60ed1c5c31c345e041e.png

为最小化上式我们对该方程求导有

22c53b32f490c85b2f8f2cdd472e435c.png

使用一阶泰勒展开B(x+vx,y+vy),并替换上式有

3120cdc46462537db85279d2a55d4175.png

所以细分表达式有:

01d5dc28675fe73b612fce659759a92b.png

残差函数表示为:

370c6e0ea7871107b122b7817a6160f5.png

最终展开求解如下

669917171ed19df35a38305aeb1a71a7.png

Refernce Jean-Yves Bouguet, “Pyramidal Implementation of the Lucas Kanade Feature Tracker Description of the algorithm”, Intel Corporation Microprocessor Research Labs. http://www.ces.clemson.edu/~stb/klt/ C++ code KLT: An Implementation of the Kanade-Lucas-Tomasi Feature Tracker

后话 公众号将会推送基于PCL库的点云处理,SLAM,三维视觉,高精地图相关的文章。公众号致力于理解三维世界相关内容的干货分享。不仅组织技术交流群,并且组建github组群,可自由分享。交流提问。

原创不易,转载请联系群主,注明出处

b613a35f18ef59f2d23dc8d826cb93b9.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DeepFlow光流法是一种使用深度学习技术的光流法,用于计算图像中像素点的运动信息。它是基于传统光流法的改进,通过引入深度学习模型来提高光流的准确性和稳定性。 DeepFlow光流法的原理是将光流计算问题转化为一个能量最小化的优化问题。它使用了一个深度学习模型来学习图像的特征表示,并通过最小化一个能量函数来求解光流场。 具体来说,DeepFlow光流法首先将输入的两幅图像通过一个预训练的深度学习模型提取特征。然后,它通过计算两幅图像特征之间的相似性来构建一个能量函数,该能量函数描述了光流场的一致性和平滑性。 接下来,DeepFlow光流法使用迭代的方式来最小化能量函数。它通过在图像中的每个像素点上计算一个位移向量来表示光流的运动方向和速度。这个位移向量是通过最小化能量函数来确定的,使得光流场在整个图像中保持一致性和平滑性。 最后,DeepFlow光流法通过插值和优化技术来提高光流的精度和稳定性。它可以处理复杂的图像场景,并且在光照变化、遮挡和纹理缺失等情况下都能获得较好的光流估计结果。 总结起来,DeepFlow光流法是一种使用深度学习技术的光流法,通过最小化能量函数来计算图像中像素点的运动信息。它能够提高光流的准确性和稳定性,并且适用于复杂的图像场景。\[2\] #### 引用[.reference_title] - *1* *2* *3* [【附代码实现】光流法大全(DeepFlow、DenseFlow、DisFlow、FbFlow、PCAFlow、SimpleFlow、TV_L1)](https://blog.csdn.net/yangchuangyc/article/details/124946688)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值