知识库 › 定位仓库学习 › 核心算法 › 前端 › Lucas-Kanade光流法
基于亮度恒定假设和运动类似假设,我们可以认为在一个极小的运动过程中,图片中特征点的亮度将维持恒定,且图片中的而所有特征点运动方向一致。所以在极短的时间中,可以通过一系列点的运动轨迹计算相机的运动状态,当然这个的核心还是以特征点光流的形式呈现的。
话又说回来,光流到底是什么呢?
光的流动,反映为一个特征点的运动状态。对于空间中存在的点来说,会在相机画面中成像,在相机画面的移动中得到一系列移动的点。我们令点的状态满足的函数为 $I(x,y,t)$,其中 $(x,y)$为点在图像坐标系的位置, $t$表示时间, $I$表示亮度。我们需要研究的核心就是这个点的图像坐标关于时间的位置变化。
现在我们带入亮度不变假设
$$I(x,y,t)=I(x+dx,y+dy,t+dt)$$
对小运动来说,我们可以直接对原式进行一阶泰勒展开,得到
$$I(x+dx,y+dy,t+dt)\approx I(x,y,t)+\frac{\partial I}{\partial x}dx+\frac{\partial I}{\partial y}dy+\frac{\partial I}{\partial t}dt$$
带入刚才的假设,消去 $I(x,y,t)$,然后两边同时除以 $dt$
$$\frac{\partial I}{\partial x}\frac{dx}{dt}+\frac{\partial I}{\partial y}\frac{dy}{dt}+\frac{\partial I}{\partial t}=0$$
这个就是光流约束方程
$$I_xu+I_yv+I_t=0$$
其中
- $I_x=\frac{\partial I}{\partial x}$:图像在 x 方向的梯度
- $I_y=\frac{\partial I}{\partial y}$:图像在 y 方向的梯度
- $I_t=\frac{\partial I}{\partial t}$:图像随时间的变化
- $u=\frac{dx}{dt}$:x 方向的光流
- $v=\frac{dy}{dt}$:y 方向的光流
这是一个线性方程但是有两个未知数,我们无法通过一帧获得完整且准确的uv信息,这就是孔径问题。
为了解决这个问题,我们近似认为同一个画面中的所有特征点都满足相同的运动特征,所以可以列出
$$\begin{bmatrix} I_{x1} & I_{y1} \\ I_{x2} & I_{y2} \\ \vdots & \vdots \\ I_{xN} & I_{yN} \end{bmatrix} \begin{bmatrix} u \\ v \end{bmatrix} = -\begin{bmatrix} I_{t1} \\ I_{t2} \\ \vdots \\ I_{tN} \end{bmatrix}$$
这个式子用N个点的信息参与运算,构建了一系列共享运动特征的方程,这样子,通过解这个方程我们就能够得到正确的uv信息了。
令 $Ad=b$,使用最小二乘法求解(移项构造残差函数,构造残差平方和,求导令导数为0)
$$d=(A^TA)^{-1}A^Tb$$
但是注意到这个假设仅针对小位移有效,且窗口内的运动情况必须一致,在大位移情况下,我们就需要引入例如金字塔光流法的方法去修正、迭代,对光流进行细化。
