1. 程式人生 > >光流法入門基礎

光流法入門基礎

本文參考了https://blog.csdn.net/zouxy09/article/details/8683859

光流的概念:它是空間運動物體在觀察成像平面上的畫素運動的瞬時速度,是利用影象序列中畫素在時間域上的變化以及相鄰幀之間的相關性來找到上一幀跟當前幀之間存在的對應關係,從而計算出相鄰幀之間物體的運動資訊的一種方法。

       當人的眼睛觀察運動物體時,物體的景象在人眼的視網膜上形成一系列連續變化的影象,這一系列連續變化的資訊不斷“流過”視網膜(即影象平面),好像一種光的“流”,故稱之為光流(optical flow)。光流表達了影象的變化,由於它包含了目標運動的資訊,因此可被觀察者用來確定目標的運動情況。

     研究光流場的目的就是為了從圖片序列中近似得到不能直接得到的運動場。運動場,其實就是物體在三維真實世界中的運動;光流場,是運動場在二維影象平面上(人的眼睛或者攝像頭)的投影。

    那通俗的講就是通過一個圖片序列,把每張影象中每個畫素的運動速度和運動方向找出來就是光流場。那怎麼找呢?咱們直觀理解肯定是:第t幀的時候A點的位置是(x1, y1),那麼我們在第t+1幀的時候再找到A點,假如它的位置是(x2,y2),那麼我們就可以確定A點的運動了:(ux, vy) = (x2, y2) - (x1,y1)。

那怎麼知道第t+1幀的時候A點的位置呢? ???這就存在很多的光流計算方法了。


 其他的咱們先不說了,迴歸應用吧(呵呵,太高深了,自己說不下去了)。OpenCV中實現了不少的光流演算法。

1)calcOpticalFlowPyrLK

通過金字塔Lucas-Kanade 光流方法計算某些點集的光流(稀疏光流)。理解的話,可以參考這篇論文:”Pyramidal Implementation of the Lucas Kanade Feature TrackerDescription of the algorithm”

2)calcOpticalFlowFarneback

用Gunnar Farneback 的演算法計算稠密光流(即影象上所有畫素點的光流都計算出來)。它的相關論文是:"Two-Frame Motion Estimation Based on PolynomialExpansion"

3)CalcOpticalFlowBM

通過塊匹配的方法來計算光流。

4)CalcOpticalFlowHS

用Horn-Schunck 的演算法計算稠密光流。相關論文好像是這篇:”Determining Optical Flow”

5)calcOpticalFlowSF

這一個是2012年歐洲視覺會議的一篇文章的實現:"SimpleFlow: A Non-iterative, Sublinear Optical FlowAlgorithm",工程網站是:http://graphics.berkeley.edu/papers/Tao-SAN-2012-05/  在OpenCV新版本中有引入。

 稠密光流需要使用某種插值方法在比較容易跟蹤的畫素之間進行插值以解決那些運動不明確的畫素,所以它的計算開銷是相當大的。而對於稀疏光流來說,在他計算時需要在被跟蹤之前指定一組點(容易跟蹤的點,例如角點),因此在使用LK方法之前我們需要配合使用cvGoodFeatureToTrack()來尋找角點,然後利用金字塔LK光流演算法,對運動進行跟蹤。但個人感覺,對於少紋理的目標,例如人手,LK稀疏光流就比較容易跟丟。