一 簡介
在視頻序列中,物體幀間移動可表示為物體的運動速度 ,該運動速度即為光流。通過數學建模,光流可表示為圖像空域差分(XY平面梯度)與圖像幀間差分(相鄰兩幀圖像差)的函數。理想情況下,我們可以計算出圖像上每一個點的運動速度,但存在兩點問題:
1)光滑平面上圖像空域差分與圖像幀間差分均為0,故計算出光流速度為0;
2)在圖像邊緣上,由於光流計算觀察一個較小鄰域,無法計算出邊緣方向上的運動速度(即孔徑問題)。
因此,在光流跟蹤中,需要對特殊點進行跟蹤以避免以上問題。該特殊點稱為角點,角點在鄰域上至少兩個方向上存在明顯梯度變化,這就避免了無法跟蹤問題。同時,在圖像匹配應用中,角點或者類似的特征點也是多幅圖像之間關聯點。
通過定位角點,在角點上應用光流算法計算出對應角點的運動速度 ,其應用包括:
1)在視頻監控中,可以估計監控視頻中的物體運動,或者通過監視場景來估計攝像機自運動;
2)對於晃動視頻,通過對光流速度估計,可以消除視頻晃動。
二 Harris角點
考慮一個固定小的圖像區域,相對於該圖像區域做任意一個小的平移 ,其變化量可用自相關函數定義:
,其中
表示固定小的圖像區域內的點,
表示對其進行任意平移后的點,
表示對區域內求所有點加權和。
對於該公式需要注意以下兩點:
1)對於圖像上任意一個固定點,其變化量隨着 的取值不同而不同,但該點作為角點的性質取決於圖像鄰域數據本身。也就是說,如果考察點為角點,使用不同方向的
代入上式,其變化量在兩個正交方向上都會得到較大值;如果考察點為邊緣,則僅在邊緣梯度方向上表現為較大值;如果考察點為平滑區域,則在每個方向上都沒有較大值。
2)圖像梯度函數為 ,當兩個梯度分量都較大時,該點可能是角點,也可能不是角點。比如,斜率為45度角的直線,在兩個方向上均有較大梯度,但不是角點。總的來說,這兩個概念是兩個不同的測量。
對以上公式進行數學變換:
假設圖像函數在 (x,y) 平面上連續且二階可導(圖像一般滿足該性質),針對較小變化量 ,
由於圖像某一點梯度為, 對
進行泰勒級數展開,
可得 ,其中 e 為二階及以上高階分量,可忽略並簡化為:
,對 自相關函數 使用泰勒級數得:
,
,進一步整理得:
,
則固定小區域的自相關矩陣為: 。
自相關矩陣A包含對應區域的變化的全部信息,通過分析該矩陣,可以判斷相應區域是否為角點區域。
由於 , 則矩陣A為正定矩陣,矩陣A存在兩個正交的特征向量,將矩陣A可分解為:
, 其中
為矩陣A的單位特征向量,自相關變量可進一步表示為:
,當
與
共線時,
取值為
;
當 與
共線時,
取值為
。也就是說,
在特征向量方向上取值取決於對應特征值。
在其他方向上, 取值介於兩個特征值之間。為了確保區域為角點,考察較小特征值大於某個閾值即可。
另外,如果將 分解為關於x,y的函數,發現
實際上為 關於x, y的二次函數,即一個向上的拋物面。
令 ,則得到一個橢圓平面,其長軸表示變化最快方向,其短軸表示變化最慢方向,當橢圓接近圓形時,該區域則為較好的角點區域。
在實際計算中,一般不直接計算出特征值,而是通過矩陣的行列式與矩陣的跡來判斷是否為角點區域,如:
1);
2) 。
三 Lucas-Kanade光流
LK光流基於以下假設:
1)被追蹤點幀間亮度保持恆定;
2)被追蹤點幀間移動較小;
3)被追蹤點鄰域運動一致。
根據假設1),可得:
,對
進行一階泰勒展開:
,
根據假設 2),幀間移動距離較小,也即幀間間隔時間較短,令 趨近於 0, 消除冗余並同時除以
得:
,其中
表示光流運動。
上式表明,被追蹤點的運動速度 由圖像梯度與幀間差分約束,我們無法通過上式求出被追蹤點的運動速度。
根據假設3),由於被追蹤點鄰域運動一致,對鄰域點做相同計算,並建立其聯立方程組,即可求解被追蹤點的運動速度。
理論上來說,只需要兩個線性不相關的方程即可求解光流速度。實際應用中,可以對鄰域內每一個點建立方程,構成超定的(overdetermined)線性方程組,從而提升計算准確度,超定線性方程組求解為: 。
以上建立了光流跟蹤的一般方法。方程組 Ax = b 具體表示為 ,
具體表示為
,矩陣
決定了方程是否存在准確解;
當矩陣 可逆時,方程組有確定解。在角點檢測中,當自相關矩陣存在兩個較大的特征值時,該點被認作角點;此時的自相關矩陣是可逆的,接近正定矩陣。這也是光流跟蹤所需要的良好條件。
對於鄰域大小選擇,當選擇鄰域較大時,可能違背 鄰域運動 一致性原則;當選擇鄰域較小時,可能遇到孔徑問題,而良好角點正好可以在較小鄰域上避免孔徑問題。
總的來說,Harris 角點特性正好避免 LK 光流跟蹤約束方程的孔徑問題,所以,使用 LK 算法跟蹤 Harris 角點可以獲得較好的結果。
在Learning OpenCV中,給出了一維圖像的光流計算解釋,這可以更直觀理解光流計算,具體如下:
針對一維圖像,有 ,其中
為一維圖像的光流速度,則
,其圖形如下:
使用 Newton 插值方法可以進一步精確光流速度,如下圖:
在實際應用中,LK光流跟蹤假設2)會經常難以滿足,使用圖像金字塔可以跟蹤幀間較大移動。首先在頂層金字塔上估計光流運動,然后在下一層金字塔中使用上層運動進一步精確光流運動。
在OpenCV中,使用 cv::goodFeaturesToTrack 提取角點,在精確度要求較高時,可使用 cv::CornerSubPix 對提取到的角點計算亞像素精度,該算法基本思想是邊緣上點與角點的連線垂直於邊緣上點梯度方向;然后使用函數 cv::calcOpticalFlowPyrLK 對提取的角點在兩幀圖像上計算對應的光流速度;最后,由於部分點的光流速度可能受到干擾影響,可以使用統計的方法剔除部分掉。
參考資料 :Learning OpenCV 3 Adrian Kaehler & Gary Bradski
Computer Vision: Algorithms and Applications Richard Szeliski