大家好,又见面了,我是你们的朋友全栈君。光流法是比较经典的运动估计方法,本文不仅叙述简单明了,而且附代码,故收藏.
在空间中,运动可以用运动场描述。而在一个图像平面上,物体的运动往往是通过图像序列中不同图象灰度分布的不同体现的。从而,空间中的运动场转移到图像上就表示为光流场,光流场反映了图像上每一点灰度的变化趋势。
光流可以看作带有灰度的像素点在图像平面运动产生的瞬时速度场。下面我们推导光流方程:
假设E(x,y,t)为(x,y)点在时刻t的灰度(照度)。设t+dt时刻该点运动到(x+dx,y+dy)点,他的照度为E(x+dx,y+dy,t+dt)。我们认为,由于对应同一个点,所以
E(x,y,t) = E(x+dx,y+dy,t+dt) —— 光流约束方程
将上式右边做泰勒展开,并令dt->0,则得到:Exu+Eyv+Et = 0,其中:
Ex = dE/dx Ey = dE/dy Et = dE/dt u = dx/dt v = dy/dt
上面的Ex,Ey,Et的计算都很简单,用离散的差分代替导数就可以了。光流法的主要任务就是通过求解光流约束方程求出u,v。但是由于只有一个方程,所以这是个病态问题。所以人们提出了各种其他的约束方程以联立求解。但是由于我们用于摄像机固定的这一特定情况,所以问题可以大大简化。
摄像机固定的情形
在摄像机固定的情形下,运动物体的检测其实就是分离前景和背景的问题。我们知道对于背景,理想情况下,其光流应当为0,只有前景才有光流。所以我们并不要求通过求解光流约束方程求出u,v。我么只要求出亮度梯度方向的速率就可以了,即求出sqrt(u*u+v*v)。
而由光流约束方程可以很容易求到梯度方向的光流速率为 V = abs(Et/sqrt(Ex*Ex+Ey*Ey))。这样我们设定一个阈值T。
V(x,y) > T 则(x,y)是前景 ,反之是背景
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163537.html原文链接:https://javaforall.cn