光流是由觀察者和場景之間的[相對運(yùn)動]引起的視覺場景中物體、表面和邊緣的運(yùn)動模式。一般而言,光流是由于場景中前景目標(biāo)本身的移動、觀測者運(yùn)動,或者兩者的共同運(yùn)動所產(chǎn)生的。

光流在很多領(lǐng)域中都被用到,例如視頻中的運(yùn)動目標(biāo)檢測,視頻壓縮等等。
在分析光流時,需要用到兩個重要假設(shè):1.對象的像素強(qiáng)度在連續(xù)幀之間不會改變。2.相鄰像素具有相似的運(yùn)動。下面我們運(yùn)用這兩個假設(shè)來推導(dǎo)光流公式。
光流法實(shí)際是通過檢測圖像像素點(diǎn)的強(qiáng)度隨時間的變化進(jìn)而推斷出物體移動速度及方向的方法。假設(shè)該移動很小,假設(shè)該移動很小,那么可以根據(jù)泰勒級數(shù)得出:
根據(jù)假設(shè)1,由于移動很小,此時這時對象位移不會改變對象的像素強(qiáng)度:
進(jìn)一步得出:
最終得出光流公式:
這里的,
是x, y方向上的速率,或稱為I(x, y, t)的光流。而
,
,
則是圖像(x, y, t)在對應(yīng)方向上的偏導(dǎo)數(shù)??梢钥吹焦饬鞴街杏袃蓚€未知量
,
, 無法直接求解。因此我們需要更多的外部條件來求解方程。
Lucas-Kanade 方法
求解光流方程有很多方法,其中最著名的便是 Lucas-Kanade方法。它應(yīng)用了之前提到的第二個假設(shè),即所有相鄰像素都將具有相似的運(yùn)動。對于每一個像素,Lucas-Kanade 方法選取與它相鄰的8個像素進(jìn)行分析。根據(jù)假設(shè),所有 9 個像素都有相同的運(yùn)動。所以現(xiàn)在我們的問題求解 只有2個未知變量的9個方程組。
......
這樣的方程組沒有唯一解,這里我們使用最最小二乘擬合方法獲得一個最優(yōu)近似解。
Lucas-Kanade方法的局限性
由于上述假設(shè)和分析都是針對較小的運(yùn)動,光流算法會受到突然移動的影響。如果兩幀圖像之間的運(yùn)動太大,光流法可能會失效。對于這個問題我們可以通過圖像金字塔來解決,當(dāng)我們使用更高層的金字塔圖像時,小的運(yùn)動被去除,大的運(yùn)動變成小運(yùn)動。然后再應(yīng)用 Lucas-Kanade,就可以得到正確的光流。
OpenCV 光流演示:https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html?