C接口:
void cvCalcOpticalFlowPyrLK( const CvArr* prev, const CvArr* curr, CvArr* prev_pyr, CvArr* curr_pyr, const CvPoint2D32f* prev_features, CvPoint2D32f* curr_features, int count, CvSize win_size, int level, char* status, float* track_error, CvTermCriteria criteria, int flags );
•prev
•在時間 t 的第一幀
•curr
•在時間 t + dt 的第二幀
•prev_pyr
•第一幀的金字塔快取. 如果指針非 NULL , 則快取必須有足夠的空間來存儲金字塔從層 1 到層 #level 的內容。尺寸 (image_width+8)*image_height/3 比特足夠了
•curr_pyr
•與 prev_pyr 類似, 用於第二幀
•prev_features
•需要發現光流的點集
•curr_features
•包含新計算出來的位置的 點集
•count
•特徵點的數目
•win_size
•每個金字塔層的搜尋視窗尺寸
•level
•最大的金字塔層數。如果為 0 , 不使用金字塔 (即金字塔為單層), 如果為 1 , 使用兩層,下面依次類推。
•status
•數組。如果對應特徵的光流被發現,數組中的每一個元素都被設定為 1, 否則設定為 0。
•error
•雙精度數組,包含原始圖像碎片與移動點之間的差。為可選參數,可以是 NULL .
•criteria
•準則,指定在每個金字塔層,為某點尋找光流的疊代過程的終止條件。
•flags
•其它選項:
•CV_LKFLOW_PYR_A_READY , 在調用之前,第一幀的金字塔已經準備好
•CV_LKFLOW_PYR_B_READY , 在調用之前,第二幀的金字塔已經準備好
•CV_LKFLOW_INITIAL_GUESSES , 在調用之前,數組 B 包含特徵的初始坐標 (Hunnish: 在本節中沒有出現數組 B,不知是指的哪一個)
函式 cvCalcOpticalFlowPyrLK 實現了金字塔中 Lucas-Kanade 光流計算的稀疏疊代版本 ([Bouguet00])。 它根據給出的前一幀特徵點坐標計算當前視頻幀上的特徵點坐標。 函式尋找具有子象素精度的坐標值。
兩個參數 prev_pyr 和 curr_pyr 都遵循下列規則: 如果圖像指針為 0, 函式在內部為其分配快取空間,計算金字塔,然後再處理過後釋放快取。 否則,函式計算金字塔且存儲它到快取中,除非設定標識 CV_LKFLOW_PYR_A[B]_READY 。 圖像應該足夠大以便能夠容納 Gaussian 金字塔數據。 調用函式以後,金字塔被計算而且相應圖像的標識可以被設定,為下一次調用準備就緒 (比如:對除了第一個圖像的所有圖像序列,標識 CV_LKFLOW_PYR_A_READY 被設定).
C++接口:
void calcOpticallFlowPyrLK (InuputArray prevImg, InputArray nextImg, InputArray prevPts, InputOutputArray
nextPts, OutputArray status, OutputArray err, Size winSize = Size(21,21), int maxLevel = 3, TermCriteria
criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01), int flags = 0, double minEigThreshold = 1e-4);
-prevImg: 深度為8位的前一幀圖像或金字塔圖像。
-nextImg:和prevImg有相同的大小和類型,後一幀圖像或金字塔。
-prevPts:計算光流所需要的輸入2D點矢量,點坐標必須是單精度浮點數。
-nextPts:輸出2D點矢量(也是單精度浮點數坐標),點矢量中包含的是在後一幀圖像上計算得到的輸入特徵新位置。
-status:輸出狀態矢量(元素是無符號char類型,uchar),如果相應特徵的流發現則矢量元素置為1,否則,為0。
-err:輸出誤差矢量。
-winSize:每個金字塔層搜尋窗大小。
-maxLevel:金字塔層的最大數目;如果置0,金字塔不使用(單層);如果置1,金字塔2層,等等以此類推。
-criteria:指定搜尋算法收斂疊代的類型
-minEigTheshold:算法計算的光流等式的2x2常規矩陣的最小特徵值。
金字塔Lucas-Kannade算法:
LK算法有三個假設:亮度恆定,即圖像場景中目標的像素在幀間運動時外觀上保持不變;時間連續或者運動是”小運動“,即圖像的運動隨時間的變化比較緩慢;空間一致,即一個場景中同一表面上鄰近的點具有相似的運動。然而,對於大多數30HZ的攝像機,大而連貫的運動是普遍存在的情況,所以LK光流正因為這個原因在實際中的跟蹤效果並不是很好。我們需要大的視窗來捕獲大的運動,而大視窗往往違背運動連貫的假設!而圖像金字塔可以解決這個問題,於是乎,金字塔Lucas-Kanade就提出來了。
金字塔Lucas-Kanade跟蹤方法是:在圖像金字塔的最高層計算光流,用得到的運動估計結果作為下一層金字塔的起始點,重複這個過程直到到達金字塔的最底層。這樣就將不滿足運動的假設可能性降到最小從而實現對更快和更長的運動的跟蹤。