1. 程式人生 > >有關opencv光流法的解釋

有關opencv光流法的解釋

1981年,Horn和Schunck創造性地將二維速度場與灰度相聯絡,引入光流約束方程,得到光流計算的基本演算法。人們基於不同的理論基礎提出各種光流計算方法,演算法效能各有不同。Barron等人對多種光流計算技術進行了總結,按照理論基礎與數學方法的區別把它們分成四種:基於梯度的方法、基於匹配的方法、基於能量的方法、基於相位的方法。近年來神經動力學方法也頗受學者重視。

       其他的咱們先不說了,迴歸應用吧(呵呵,太高深了,自己說不下去了)。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稀疏光流就比較容易跟丟。

       至於他們的API的使用說明,我們直接參考OpenCV的官方手冊就行:

       IJCV2011有一篇文章,《A Database and Evaluation Methodology for Optical Flow》裡面對主流的光流演算法做了簡要的介紹和對不同演算法進行了評估。網址是: