由於攝像機系統將三維場景轉換為二維影象丟失了很多資訊,因此要在二維影象中估計物體的運動情況就需要引入額外的資訊。光流演算法就是通過引入前後兩幀影象的差異,從而將現實世界的運動場轉換成成二維影象中的光流場。
前一幀表示為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光流執行結果:![](https://pic.w3help.cc/616/12310ba7390c58f399bcdd75925b1.jpeg)
光流法詳解之一 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...