光流的概念最早是由Gibson在1950年提出的。它是空間移動物體在像素觀察平面中移動的瞬時速度。是一種計算物體在相鄰幀間運動信息的方法。
一般來說,光流(Optical Flow)是物體在三維空間中的運動在二維像平面上的投影。它是由物體和相機的相對速度產生的,反映了物體在極小時間內對應的圖像像素的運動方向和速度。
Lucas–Kanade方法(KLT)是一種基於光流原理的特徵點跟蹤算法。本文首先介紹光流的原理,然後介紹了KLT及其相關的KLT變體算法。
光流約束方程
假設I(x,y,t)為時刻t像素點(x,y)的像素值(亮度),該像素點在兩個圖像幀之間移動了Δx,Δy,Δt。因此我們可以得出相同亮度的結論:
假設運動很小,我們可以從泰勒級數推導一階泰勒展開式:
因此,
其中(dx/dt, dy/dt) = (u, v)為待解像素的光流。
(I/x,I/y) = (I_x, I_y)是像素灰度空間微分,t = I_x是像素坐標點的時間灰度微分。
整理成矩陣形式:
該公式表明,同一坐標位置上的時間灰度微分是空間灰度微分與該位置上相對於觀測者的速度的乘積。假設空間一致性,對於周圍的多個點,有:
這個方程組的方程多於未知數,因此通常是超定的。Lucas-Kanade方法通過最小二乘原理獲得折衷解決方案:
這就是光流算法的孔徑問題。為了找到光流,需要另一組方程,並附加約束條件。所有的光流方法都引入了估算實際流的附加條件。
局部差分法:Lucas-Kanade算法
為了使方程可求解,進行以下假設:
亮度是恆定的,圖像中對象的像素亮度在連續幀之間不會改變;短距離(短期)運動,相鄰幀之間的時間足夠短,並且物體運動很小;空間一致性,相鄰像素具有相似的運動;恆定亮度是指某些像素的跟蹤不隨時間變化:
公式表示被跟蹤像素的灰度不隨時間變化:
連續時間意味著相鄰幀之間的運動很小。換句話說,運動的變化可以被認為是亮度相對於時間的導數。一維空間的示例:
其中,Ix是圖像的偏導數,It是圖像隨時間的導數,v是所需速度。
與之前直接比較像素灰度值的方法不同,Lucas-Kanade算法比較像素周圍的窗口像素以找到最相似的像素。假設光流在短時間τ內,前後兩幀滿足:
其中D為變形矩陣,d稱為位移向量,D表示兩像素窗口塊移動後的變形量,因此,當窗口較小時,將更加難以估計。通常,D可用於測量兩個像素窗口的相似度,即特徵點是否漂移。對於光流跟蹤,通常僅考慮平移模型:
為了通用性,我們使用仿射運動模型來推導Lucas-Kanade算法的原理。在像素窗口下,構造誤差函數:
其中w(x)是權重函數,可以定義為高斯函數。分別對變量d和D進行微分:
其中
記住光流u = Dx + d,然後對運動後的像素點進行泰勒展開:
這裡給出了平移運動模型的結果。設D = 0:
其中Z是2×2矩陣,e是2×1向量。這是一個線性方程優化問題。當Z是可逆的時,可以輕鬆地求解該方程。由於泰勒展開式是在推導過程中使用的,因此僅當像素位移較小時才成立。在實際操作中,通常每次將最後結果用於初始化和進一步解決時(在Newton-Raphson Fasion中),都需要迭代解決。
工作實例
在光流可以工作之前,我們必須給它提供一組關鍵點以在兩個圖像幀之間進行跟蹤。
在下面的示例中,我們使用了Shi-Tomasi corner detector,該detector使用與Harris corner detector相同的過程來查找構成圖像中「角點」的強度模式,只是它增加了一個額外的參數來幫助選擇最突出的角點。
一旦我們在我們感興趣的初始圖像上檢測到關鍵點,我們就可以計算這幅圖像(幀1)和下一幀(幀2)之間的光流。它接收初始圖像幀、下一幅圖像幀和一組點,並返回下一幀中檢測到的點和一個值,該值指示從一幀到下一幀的點之間的匹配程度。
這些參數還包括窗口大小和maxLevels,它們指示窗口的大小以及將使用pyramid縮放來縮放給定圖像的級數。對匹配點進行迭代搜索,最後一個參數反映了這個匹配條件(如果使用不同的圖像,您可能需要更改這些值,但是這些值應該適用於提供的示例)。Python示例代碼如下
接下來,讓我們顯示最終的運動向量,Python示例代碼如下