LK光流演算法及其opencv的自定義實現

2021-09-05 13:05:56 字數 1864 閱讀 8325

由於攝像機系統將三維場景轉換為二維影象丟失了很多資訊,因此要在二維影象中估計物體的運動情況就需要引入額外的資訊。光流演算法就是通過引入前後兩幀影象的差異,從而將現實世界的運動場轉換成成二維影象中的光流場。

前一幀表示為h(x,y),後一幀表示為i(x,y)

兩幀在x方向有u個畫素的位移,在y方向有v個畫素的位移

光流問題推導三大假設:

h(x,y)中的點與i(x,y)中目標對應的點(注意不是畫素對應的點)灰度值相等

可以列出方程:

h(x,y)= i(x+u,y+v)

(2)spatial coherence

認為相鄰畫素運動場近似相同,運動場是空間相關的

(3)small motion

微小的運動,這是光流演算法work的基礎

公式推導

因為假設(3),u、v都足夠小,因此可以對i(x+u,y+v)進行泰勒級數展開,並且忽略高階項:

由假設1,h(x,y)= i(x+u,y+v),所以

用矩陣表示即

以上方程是光流問題的基本求解方程。

#include #include "opencv2/imgproc/imgproc.hpp"

#include #include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include #include #define atd atusing namespace cv;

using namespace std;

//用兩幀獲得ix

mat get_ix(mat &src1, mat &src2)

//用兩幀獲得iy

mat get_iy(mat &src1, mat &src2)

//用兩幀獲得it

mat get_it(mat &src1, mat &src2)

//取3*3的視窗,做9個值的和

mat get_sum9(mat &m)

//lk演算法實現

//輸入:兩幀 img1和img2

//輸出:計算結果 u(x方向光流)和v(y方向光流)

void getlucaskanadeopticalflow(mat &img1, mat &img2, mat &u, mat &v)

//在一張img上根據u和v畫出光流場

void draw_optical_flow(mat &img, mat &u, mat &v)

}} }

}void main()

注意,為了減少計算量,這裡取用的視窗是3*3的,實際速度還可以lk光流執行結果:

光流法詳解之一 LK光流)

lucas kanade光流演算法是一種兩幀差分的光流估計演算法。它由bruce d.lucas 和 takeo kanade提出 1 lk光流法有三個假設條件 1.亮度恆定 乙個畫素點隨著時間的變化,其亮度值 畫素灰度值 是恆定不變的。這是光流法的基本設定。所有光流法都必須滿足。2.小運動 時間的...

LK光流演算法的三個假設

在實際過程中採用 lucas kanade 光流演算法跟蹤運動物體特徵點的時候,乙個很明顯的特點是lk演算法 包括其他光流演算法 不能計算 大運動 加上金子塔的方法稍微好點。這是什麼原因?檢視lk演算法的三個假設 1 亮度恆定 2 時間連續或者運動是 小運動 3 空間一致 同一子影象的畫素點有相同的...

opencv 光流跟蹤

物件跟蹤三要素 影象表示,外觀模型,移動模型 klt lucas kanade tracker 條件 亮度恆定,近距離移動,空間一致性 稀疏光流 sparse optical flow 找到特徵點 角點檢測法 include include using namespace cv using name...