运动目标检测之光流法(2):金字塔Lucas-Kanade算法
參考鏈接1:添LK金字塔光流法與簡單實現
參考鏈接2:LK算法改進(金字塔LK)
參考鏈接3:看公式推導
1.光流法
在計算機視覺中,Lucas–Kanade光流算法是一種兩幀差分的光流估計算法。它由Bruce D. Lucas 和 Takeo Kanade提出。
1.1 定義
空間運動物體在觀察成像平面上的像素運動的瞬時速度,是利用圖像序列中像素在時間域上的變化以及相鄰幀之間的相關性來找到上一幀跟當前幀之間存在的對應關系,從而計算出相鄰幀之間物體的運動信息的一種方法。也就是說,由空間域到圖像平面的投影。而通俗來講,把圖像中的每一個點的瞬時速度和方向找出來就是光流。
1.2 假設條件
(1)亮度恒定,就是同一點隨著時間的變化,其亮度不會發生改變。這是基本光流法的假定(所有光流法變種都必須滿足),用于得到光流法基本方程;
(2)小運動,這個也必須滿足,就是時間的變化不會引起位置的劇烈變化,這樣灰度才能對位置求偏導(換句話說,小運動情況下我們才能用前后幀之間單位位置變化引起的灰度變化去近似灰度對位置的偏導數),這也是光流法不可或缺的假定;
(3)空間一致,一個場景上鄰近的點投影到圖像上也是鄰近點,且鄰近點速度一致。這是Lucas-Kanade光流法特有的假定,因為光流法基本方程約束只有一個,而要求x,y方向的速度,有兩個未知變量。我們假定特征點鄰域內做相似運動,就可以連立n多個方程求取x,y方向的速度(n為特征點鄰域總點數,包括該特征點)。
1.3 光流法的基本方程
但是這個我們要計算一個點的光流,有兩個未知數,只有一個方程,該如何解呢?針對這個問題,有很多解決方法:
- 基于梯度的方法
- 基于匹配的方法
- 基于能量的方法
- 基于相位的方法
下面我們介紹一個很經典的算法, LK光流提取算法
2.Lucas–Kanade算法
基本假設:光流在像素點的鄰域是一個常數
我們首先要設置一個鄰域的窗口,之后計算光流
當窗口較大時,光流計算更魯棒
當窗口較小時,光流計算更正確
原因在于,當圖像中每一個部分的運動都不一致的時候,如果開的窗口過大,很容易違背假設:窗口(鄰域)內的所有點光流一致,這可能與實際不一致,所以窗口小,包含的像素少,更精確些。當運動較為劇烈的時候,無法實現光流的基本假設,所以當我們的領域加大的時候,算法更魯棒。
如何解決這一問題,我們采用了金字塔的方法,即窗口固定,將圖像生成金字塔,在每一層金字塔上都用同一個大小的窗口來進行光流計算。那么在圖像大小較小的時候,窗口顯得較大,此時的光流可以跟蹤速度較快的目標,而在原始圖像的時候,光流窗口相對較小,得到的光流就更準確。這是一個由粗到精的過程。
因為LK算法的約束條件即:小速度,亮度不變以及區域一致性都是較強的假設,并不很容易得到滿足。如當物體運動速度較快時,假設不成立,那么后續的假設就會有較大的偏差,使得最終求出的光流值有較大的誤差。構建圖像金字塔可以解決大運動目標跟蹤,也可以一定程度上解決孔徑問題(相同大小的窗口能覆蓋大尺度圖片上盡量多的角點,而這些角點無法在原始圖片上被覆蓋)??紤]物體的運動速度較大時,算法會出現較大的誤差。那么就希望能減少圖像中物體的運動速度。一個直觀的方法就是,縮小圖像的尺寸。假設當圖像為400×400時,物體速度為[16 16],那么圖像縮小為200×200時,速度變為[8,8]??s小為100*100時,速度減少到[4,4]。所以光流可以通過生成 原圖像的金字塔圖像,逐層求解,不斷精確來求得。簡單來說上層金字塔(低分辨率)中的一個像素可以代表下層的兩個。
3.Lucas–Kanade光流算法的改進
Jean-Yves Bouguet提出一種基于金字塔分層,針對仿射變換的改進Lucas-Kanade算法。
對于Lucas-Kanade改進算法來說,主要的步驟有三步:建立金字塔,基于金字塔跟蹤,迭代過程。
3.1 構建圖像金字塔
令I0 = I 是第 0 層的圖像,它是金字塔圖像中分辨率最高的圖像,圖像的寬度和高度分別定義為nx0 = nx 和 ny0 = ny 。以一種遞歸的方式建立金字塔:從I0中計算I1,從I1中計算I2 ,···。用一個[0.25 0.5 0.25]的低通濾波器對I L ? 1
? 進行卷積。
計算公式為:
3.2 基于金字塔跟蹤和迭代
我們對視頻中點的跟蹤實際上是對相鄰兩幀的圖像進行處理,設圖像I和J為相鄰兩幀的圖像,我們希望在圖像J中找到u0的對應點v,那么首先對兩幅圖像進行分層,假設如上圖分為3層,如此可以分別計算得到u1、u2、u3。
對于金字塔我們從最高層開始進行處理, u3在圖像J中的對應初始點為v31(v31和u3是相等的,圖畫的不太準),然后通過某種計算符合相應的條件后,得到當前層最小誤差點v3n(n表示經過n次計算)和相應的光流。然后利用計算得到的光流能夠在圖像J中找到點v21作為第二層的初始點,以此類推進行和第3層一樣的迭代計算最終能夠獲得包含各層光流分量的總光流,就能得到最終的對應點v0r。
建立金字塔后,首先對于最高層的圖像計算出其上的光流;
通過上一層(L+1層)的計算結果對下一層(L層)的的圖像進預平移,并在L層的基礎上計算出該層的殘余光流向量dL。由于金字塔中每一層的尺寸均是上一層的一半,因此其每一層的光流均是其上一層的二分之一。
通過L+1層計算出的光流作為初值計算L層的光流,可以保證每一層的殘余光流向量較小,從而應用L-K光流算法;
對于每一層迭代光流計算,最終得到的光流也即是所有層光流的疊加。
由于頂層圖像尺寸較小,其初始的光流估計量可以設置為0,即 gL = [0, 0] 。
4 特征點選擇
1、計算圖像 I 中每一個像素的矩陣G和最小特征值λm。
2、尋找整副圖像中最小特征值 λm 中的最大特征值λmax。
3、保留最小特征值 λm 大于給定閾值的像素點。閾值通常取5% λmax ~10% λmax 。
4、保留 λm 局部最大值的像素:像素特征值 λm 大于其3*3 鄰域中其他像素的特征值 λm 。
5、剔除像素密集區域中的一些像素,確保圖像中相鄰像素的距離都大于給定的閾值(常取5~10 pixels)。
上述操作完成后,圖像 I 中剩下的像素即為選擇的特征點,并作為跟蹤特征點。特征點選擇算法的步驟5 確保了特征點間的最小距離。
沒有必要取一個大的綜合窗口選擇特征點(或計算矩陣G)。大量實驗證明,wx = wy =1的 3*3 大小的綜合窗口能夠取得滿意的效果。
注:1.某種計算具體見論文。
2.相應條件包含兩種,一是達到設置的迭代次數上限,二是計算結果符合精確度閾值。
3.論文中能夠得到一些參數設置信息,迭代次數一般設置為5次即可(但是opencv中默認為30次),金字塔層數≤4,搜索窗大小為奇數x奇數。
總結
以上是生活随笔為你收集整理的运动目标检测之光流法(2):金字塔Lucas-Kanade算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL笔记:第07章_InnoDB数
- 下一篇: OpenSSL之十四:PKCS#8 和