光流的概念是gibson在2023年首先提出來的。它是空間運動物體在觀察成像平面上的畫素運動的瞬時速度,是利用影象序列中畫素在時間域上的變化以及相鄰幀之間的相關性來找到上一幀跟當前幀之間存在的對應關係,從而計算出相鄰幀之間物體的運動資訊的一種方法。一般而言,光流是由於場景中前景目標本身的移動、相機的運動,或者兩者的共同運動所產生的。
那通俗的講就是通過乙個序列,把每張影象中每個畫素的運動速度和運動方向找出來就是光流場。那怎麼找呢?咱們直觀理解肯定是:第t幀的時候a點的位置是(x1, y1),那麼我們在第t+1幀的時候再找到a點,假如它的位置是(x2,y2),那麼我們就可以確定a點的運動了:(ux, vy) = (x2, y2) - (x1,y1)。
l-k演算法需要滿足如下3個假設:
1)亮度恆定假設。即假設場景中目標在運動時外觀顏色是不變的,也即在影象中的畫素在兩幀中的亮度保持不變。
2)時間連續或運動是小運動。即影象中物體的運動隨時間變化緩慢,在連續的兩幀影象間,物體的位移比較小。
3)空間一致性假設。影象中同一物體表面上鄰近的畫素點的運動是一致的,且這些點一定是聚集在乙個區域內的。
假設以m點為中心的灰度區域內的光流均一致,那麼對於不同的畫素點賦予不同的權值,就可以將光流的計算方程式轉化為以下形式:
由於之前的l-k光流法對於大運動的跟蹤束手無策,然後有人又提出影象金字塔的方法來解決這個問題。通過建立金字塔,在多尺度下計算光流,使得光流的計算的準確性又跨越了一步。
金字塔光流的思想是對每個影象幀向下取樣,分別建立多級金字塔,當取樣到足夠小以後,相鄰的影象幀之間的運動將變得很小,以至於可以看成是物體的運動隨時間變化很慢的運動情況,這時候就可以用l-k
方法計算目標的光流,再將計算出來的光流向底層投影,計算下一層的光流,直到估算出原影象幀的光流。
實際運用中,通常只計算到3-4層金字塔,沒有必要建立更多的金字塔層數,因為隨著影象的移動,演算法可以應對光流大於視窗尺寸的特徵點跟蹤問題。
金字塔l-k光流通常用來估計影象特徵點的光流,以提高影象光流場的計算速度。若給定影象i中的畫素點u,計算影象j中與其匹配的畫素點v,使得v=u+d。
其計算的總體流程如下:
首先,計算金字塔最頂層影象的光流,根據最頂層光流結果計算其次上層的光流初始值,再進一步估算其光流的精確值。最後,用計算的次上層光流結果估計下一層光流的初始值,計算其精確的值後再繼續帶入下一層計算,直到金字塔的最底層。下面以偽**的形式給出金字塔l-k光流的計算過程:
opencv的光流實現由好幾個方法可以(也就是說有好幾個函式可以用),每個函式當然也對應著不同的原理,那麼它的效果以及演算法的速度等等就會有一些差別。主要包括以下幾種:
calcopticalflowpyrlk
calcopticalflowfarneback
calcopticalflowbm
calcopticalflowhs
calcopticalflowsf
這裡先簡單介紹下calcopticalflowpyrlk函式
calcopticalflowpyrlk(previmg,nextimg,prevpts,nextpts,status,err)
previmg:就是你需要輸入計算光流的前一幀影象
nextimg就是下一幀影象(可以看到一次光流就是在兩針影象之間找不同)。
prevpts是前一幀影象中的特徵點,這個特徵點必須自己去找,所以在使用calcopticalflowpyrlk函式的時候,前面需要有乙個找特徵點的操作,那麼一般就是找影象的角點,就是乙個畫素點與周圍畫素點都不同的那個點,這個角點特徵點的尋找,opencv也提供夜歌函式:goodfeaturetotrack()(後面再介紹這個函式)。那麼關於特徵點有沒有其他的方式呢?肯定是有的而且還很多吧。
nextpts引數就是計算特徵點在第二幅影象中的新的位置,然後輸出。特徵點的新位置可能變化了,也可能沒有變化,那麼這種狀態就存放在後乙個引數status中。err就是新舊兩個特徵點位置的誤差了,也是乙個輸出矩陣。
其他引數預設吧。
基於特徵點的跟蹤演算法大致可以分為兩個步驟:
1)探測當前幀的特徵點;
2)通過當前幀和下一幀灰度比較,估計當前幀特徵點在下一幀的位置;
3)過濾位置不變的特徵點,餘下的點就是目標了。
車是運動的物體,大體檢測出來了#include #include #include #include #include #include #include using namespace std;
using namespace cv;
int main()
}features_after.resize(k);//擷取
cout<
目標檢測光流法(二):opencv下的光流l-k演算法
Lucas Kanade光流演算法
x v y vzi xvx iyv y izv z it。寫做 這個方程有三個未知量,尚不能被解決,這也就是所謂光流演算法的光圈問題。那麼要找到光流向量則需要另一套解決的方案。而lucas kanade演算法是乙個非迭代的演算法 假設流 vx,vy,vz 在乙個大小為m m m m 1 的小窗中是乙...
光流演算法 Horn Schunck光流講解
光流 optical flow 是空間運動物體在觀察成像平面上的畫素運動的瞬時速度。光流場是乙個二維向量場,它反映了影象上每一點灰度的變化趨勢,可看成是帶有灰度的畫素點在影象平面上運動而產生的瞬時速度場。它包含的資訊即是各像點的瞬時運動速度向量資訊。光流的集合。亮度恆定不變。同一目標幀間變化亮度不發...
光流法詳解之一 LK光流)
lucas kanade光流演算法是一種兩幀差分的光流估計演算法。它由bruce d.lucas 和 takeo kanade提出 1 lk光流法有三個假設條件 1.亮度恆定 乙個畫素點隨著時間的變化,其亮度值 畫素灰度值 是恆定不變的。這是光流法的基本設定。所有光流法都必須滿足。2.小運動 時間的...