DeepFlow高效的光流匹配算法(上)

本週主要介紹一篇基於傳統光流法而改進的實現快速的稠密光流算法。該算法已經集成到OpenCV中,算法介紹網址:http://lear.inrialpes.fr/src/deepmatching/

在介紹該高效的算法之前,我們先介紹一下經典的LK光流算法,所以這篇文章將分爲上下兩篇。
第一篇主要介紹光流算法的基礎知識,以及理論推導。
第二篇將介紹改進的稠密光流算法匹配算法DeepFlow,並展示windows下OpenCV中集成代碼和在linux下源碼的運行效果。

光流算法基礎
光流(Optical Flow)是目前運動圖像分析的重要方法,它的概念是由 James J. Gibson於20世紀40年代首先提出的,是空間運動物體在觀察成像平面上的像素運動的瞬時速度。這種運動模式是有一個觀察者在一個視角下,評估兩幅圖像之間的變形。

光流計算基於物體移動的光學特性提出2個假設
(1)亮度恆定不變,就是同一點隨着時間的變化,其亮度不會發生改變。這是基本光流法的假定(所有光流法變種都必須滿足),用於得到光流法基本方程;
(2)時間連續性或者運動時小運動,這個也必須滿足,就是時間的變化不會引起位置的劇烈變化,這樣灰度才能對位置求偏導(換句話說,小運動情況下我們才能用前後幀之間單位位置變化引起的灰度變化去近似灰度對位置的偏導數),這也是光流法不可或缺的假定;
首先我們需要對光流有一個基本認識:
在這裏插入圖片描述連續幀的圖像
在這裏插入圖片描述
特徵點(角點)提取
在這裏插入圖片描述
特徵點跟蹤
在這裏插入圖片描述
光流跟蹤效果圖

在基於以上的前提下,我們假設有兩幀圖像,如下點(x,y)經過(u,v)的位移對應第二幀圖像上的(x+u,y+v)
在這裏插入圖片描述
Ix和Iy就是該點在x軸方向上和y方向的導數。It是該點對時間的求導,在極小時間內圖像亮度恆定的條件下It爲兩幀圖像上灰度值之差。因此有公式(4)
在這裏插入圖片描述
這就就是基本的光流約束條件,Ix,Iy,It均可由圖像數據求得,而(u,v)即爲所求光流矢量。但是光流的約束方程只有一個,而需要求出x,y方向的速度u和v(兩個未知量),一個方程兩個未知量是沒有辦法求解的,所以下文介紹的LK光流法考慮到了像素點的領域,將問題轉變成了計算這些點集的光流,聯立多個方程,從而解決這個問題。

LK光流

LK( Lucas–Kanade )光流算法是一種兩幀差分的光流估計算法。它由Bruce D. Lucas 和 Takeo Kanade提出。
光流分爲稠密光流法和稀疏光流法,稀疏光流主要是跟蹤特徵點,稠密光流是跟蹤圖像中的每個像素,由這篇文章延伸出來的下篇文章DeepFlow就是稠密光流中目前爲止最爲高效的稠密光流算法。
LK光流算法加了一個更加嚴格的條件—空間一致性,一個場景上鄰近的點投影到圖像上也是鄰近點,且鄰近點速度一致。這是Lucas-Kanade光流法特有的假定,因爲光流法基本方程約束只有一個,而要求x,y方向的速度,有兩個未知變量。我們假定特徵點鄰域內做相似運動,就可以聯立n多個方程求取x,y方向的速度(n爲特徵點鄰域總點數,包括該特徵點)。

領域內光流一致,一個場景中的同一個表面的局部領域內具有相似的運動,在圖像平面上的投影也在鄰域區域,且臨近點速度一致,認爲鄰域內所有像素點的運動一致的,這是LK光流特有的假定。
具體到圖像中,所以下圖所示,Wx,Wy是塊區域的大小。
在這裏插入圖片描述
根據以上的區域灰度值不變且鄰域內的所有像素點運動一致的。可以得出以下
在這裏插入圖片描述
該方程中只有兩個未知數,u和v,卻有n個方程也是不合理的,說明這個方程中也有多餘的,怎麼樣才能得到最優解呢?可以將上式整理爲
在這裏插入圖片描述
簡單寫爲,其中A是在x,y方向上導數,x爲要求的u和v向量。
在這裏插入圖片描述
最終得出
在這裏插入圖片描述
所以這裏我們列出了這些方程的殘差函數
在這裏插入圖片描述
那麼最終只需要求得到該殘差方程的偏移量最小,也就是使用了最小二乘法求出這個方程組的最優解。

上面提到了LK光流的假定是小運動,可是運動較快的時候應該怎麼辦呢?考慮到兩幀之間的物體的位移比較大,且運動快速時,算法會出現較大的誤差,那麼就希望減少圖像中物體的運動位移,怎麼做的?那就要縮小圖像的尺寸,假設當圖像爲400400,物體的位移爲【16,16】那麼當圖像縮小爲200200位移就變成了[8,8] 縮小爲100*100 位移縮小爲[4,4],所以在原圖像縮放了很多以後,LK光流法又變得適用了。所以LK光流引入了圖像金字塔,上層金字塔(低分辨率)中的一個像素可以代表下層的兩個像素,這樣利用金字塔的結構,將圖像逐層的分解,自上而下修正的運動量。

加入圖像金字塔光流的計算

(1)圖像金字塔,首先對每一幀圖像建立一個高斯金字塔,最低分辨率圖像在最頂層,原始圖像在底層。
在這裏插入圖片描述
在這裏插入圖片描述
(2)計算光流使用頂層(Lm)層開始,通過最小化每個點領域範圍內的匹配誤差和,得到每個頂層圖像中每個點的光流。該步驟主要是求解上述的殘差函數,不再贅述。
假設圖像的尺寸每次縮放爲原來的一半,一共縮放了Lm層,則第0層爲原始圖像,設已知原圖的位移爲d,則每一層的位移可以表示爲
在這裏插入圖片描述
所以頂層的光流計算結果,也就是位移,反應到Lm-1層,作爲該層初始時的光流值的估計g表示爲:
在這裏插入圖片描述
沿着金字塔向下反饋,重複估計每一層的位移,直到最底層也就是原始圖像計算像素的位移:
在這裏插入圖片描述
可以理解爲 準確值=估計值+殘差,對於每一層L,每個點的光流的計算都是基於鄰域內所有點的匹配誤差和最小化

這樣的搜索方式,不僅可以解決大運動目標跟蹤,也可以在一定程度上解決孔徑問題(相同大小的窗口能覆蓋大尺度圖片上儘可能多的角點,而這些角點無法在原始圖像上被覆蓋)由於金字塔的縮放減小了物體的位移,也就減小了光流,其中頂層圖像中的光流的估計值設置爲0
在這裏插入圖片描述
光流殘差方程推導

求解光流最重要的是最小化上文提到的殘差方程:
在這裏插入圖片描述
爲最小化上式我們對該方程求導有
在這裏插入圖片描述
使用一階泰勒展開B(x+vx,y+vy),並替換上式有
在這裏插入圖片描述
所以細分表達式有:
在這裏插入圖片描述
殘差函數表示爲:
在這裏插入圖片描述
最終展開求解如下
在這裏插入圖片描述
Refernce
Jean-Yves Bouguet, “Pyramidal Implementation of the Lucas Kanade Feature Tracker Description of the algorithm”, Intel Corporation Microprocessor Research Labs.
http://www.ces.clemson.edu/~stb/klt/ C++ code
KLT: An Implementation of the Kanade-Lucas-Tomasi Feature Tracker

後話
公衆號將會推送基於PCL庫的點雲處理,SLAM,三維視覺,高精地圖相關的文章。公衆號致力於理解三維世界相關內容的乾貨分享。不僅組織技術交流羣,並且組建github組羣,可自由分享。交流提問。

原創不易,轉載請聯繫羣主,註明出處
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章