LK光流法是什么
在很多場景我們都需要對特征點進行跟蹤,比如人臉,無人機目標跟蹤,SLAM中特征點跟蹤來計算相機的姿態等等。最粗暴的方式是每次都重新計算一次特征點,然后找到前后兩張圖片的相同特征點,那么就可以實現跟蹤。這種方法的特點是准確,因此在很多場合都有應用,如果你感興趣可以看看這篇文章視覺SLAM中ORB特征點算法(關鍵點+描述子)。但是這種方法計算復雜度太高,因為每次都得遍歷整個圖找關鍵點,找完關鍵點后還得根據描述子找相同的特征點。事實上,如果我們不每次都找特征點,只是在第一幀找特征點。然后后面就只跟蹤這個特征點像素那么就極大的減少計算量。LK光流法就是這個思想。
LK光流法怎么做
注意:你看到任何光流法都是有一個默認的前提假設那就是“某個特征點在各個幀中的灰度值是不變的,變化的只是位置關系”。你或許會問那不是很容易不成立嗎?其實很多算法都是有很多前提假設的,能算出來總比算不出來好。任何算法都是在一定前提假設情況下成立的。
注意:下面提到的圖片均是指的是一個視頻中的某一幀圖片,比如時刻t的圖片指的是視頻中時刻t那一幀的圖片。
假設我要跟蹤當前時刻t位於(x,y)處的那個像素。那么我的目標就是計算出它下一個時刻t+dt的位置(x+dx,y+dy)。其中dx和dy分別是那個像素在x方向和y方向移動的距離。在前面提到了任何光流法都是默認同一個特征點像素的灰度值是不會發生變化的。也就是說原先t時刻的圖片中的(x,y)處的像素灰度值與t+dt時刻圖片的(x+dx,y+dy)處的灰度值是一樣的。
假設第t個時刻圖片的位置為(x,y)的像素灰度值為
I(x,y,t),同理第t+dt時刻的圖(x+dx,y+dy)處的灰度值為
I(x+dx,y+dy,t+dt)。
前面我們提到了“任何光流法都是默認同一個特征點像素的灰度值是不會發生變化的”。也就是說
I(x,y,t)=I(x+dx,y+dy,t+dt)。注意:我們的目標是為了解出
dx,dy到底是多少。所以我們還得找個方程式,而且包含
I(x,y,t)和I(x+dx,y+dy,t+dt)。事實上我們可以對
I(x+dx,y+dy,t+dt)進行一階泰勒展開這樣得到
I(x+dx,y+dy,t+dt)=I(x,y,t)+dxdIdx+dydIdy+dtdIdt。
現在我們得到了下面兩個方程:
-
I(x,y,t)=I(x+dx,y+dy,t+dt)
-
I(x+dx,y+dy,t+dt)=I(x,y,t)+dxdIdx+dydIdy+dtdIdt
所以這意味着:
dxdIdx+dydIdy+dtdIdt=0,等式兩邊同時除
dt得到:
dxdIdtdx+dydIdtdy=−dtdI.
現在我們分析下各個部分代表什么意思:
-
dtdx,
dtdy這兩個分別表示特征點在x和y方向上的移動速度。
-
dxdI和
dydI表示在x和y方向上的灰度變化,其實就是x方向和y方向相鄰像素灰度值之差。
-
dtdI表示同在(x,y)處,t時刻與t+dt時刻兩個時刻的周圍灰度值變化。
當然現在我們只有一個方程無法解得
dtdy和
dtdx。但是我們可以有很多特征點,而同一個圖片上的特征點默認他們是移動速度是一樣的,多個特征點一定可以解得
dtdy和
dtdx。下面是我們取k個特征點時候的得到的k個方程,我們只需要解這個線性方程即可得到
dtdy和
dtdx。得到這個兩個了,
dt是時間間隔我們是知道的,那么就很容易計算出下個時刻
t+dt的特征點在圖片中的位置(x+dx,y+dy)。
⎣⎡[dxdI1,dydI1]...[dxdI1,dydI1]⎦⎤[dtdxdtdy]=⎣⎡dtdI1...dtdIk⎦⎤
具體代碼實現:
https://ww2.mathworks.cn/matlabcentral/fileexchange/48744-lucas-kanade-tutorial-example-1
https://ww2.mathworks.cn/matlabcentral/fileexchange/48745-lucas-kanade-tutorial-example-2