運動目標檢測 光流法

2021-08-31 13:18:44 字數 3772 閱讀 9567

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

2023年gibson首先提出了光流的概念,光流(optical flow)法是空間運動物體在觀測成像面上的畫素運動的瞬時速度。物體在運動的時候,它在影象上對應點的亮度模式也在做相應的運動,這種影象亮度模式的表觀運動就是光流。光流的研究就是利用影象序列中畫素的強度資料的時域變化和相關性來確定各自畫素位置的「運動」。光流表達了影象的變化,因此可被觀察者用來確定目標的運動情況。一般情況下,光流由相機運動、場景中目標運動或兩者的共同運動產生。

光流場是由光流引申出來的,它指的是景物中可見畫素點的三維速度向量在成像表面投影形成的二維瞬時速度場。空間中的運動場轉移到影象上就表示為光流場,光流場反映了影象上每一點的灰度變化趨勢。光流場包含了被觀察物體的運動資訊以及有關景物豐富的三維結構的資訊,它是如今計算機視覺及有關研究領域中的乙個重要組成部分。

光流法檢測運動目標,其基本思想是賦予影象中的每乙個畫素點乙個速度向量,從而形成了該影象的運動場。影象上的點和三維物體上的點在某一特定的運動時刻是一一對應的,根據各畫素點的速度向量特徵對影象進行動態的分析。若影象中不存在運動目標,那麼光流向量在整個影象區域則是連續變化的,而當物體和影象背景中存在相對運動時,運動物體所形成的速度向量則必然不同於鄰域背景的速度向量,從而將運動物體的位置檢測出來。

光流不能由運**像的區域性資訊來唯一的確定,例如,亮度等值線上的點或者亮度比較均勻的區域都無法唯一的確定其點的運動對應性,但是運動是可以進行觀察得到。由此說明運動場和光流不一定是唯一對應的,即光流不一定是由物體運動產生的,反之如果物體發生了運動也不一定就能產生光流。但是一般情況下,表觀運動和物體真實運動之間的差異是可以忽略的,可以用光流場代替運動場來分析影象中的運動目標及其相關的運動引數。

可以證明動能場不僅僅是分塊連續的,並且其間斷點恰好為物體的邊緣。如此,我們便可以利用影象每一幀的運動場,在動能變化矩陣中提取極值點,便可以得到運動物體的邊緣。可將動能大致相同的點歸於同一物體,進而對影象序列進行分割,從而檢測出多個運動目標。這樣,我們就將運動目標檢測問題,借助光流場轉換為靜態影象的區域分割問題。

演算法步驟如下:

(1)令i=1,獲得第i幀影象i(x,i);

(2)獲得第i+1幀影象i(x,i+1);

(3)對影象去噪,得到去燥後影象i '(x, i)和i '(x, i+1);

(4)利用i '(x, i)和i '(x, i+1)計算得到光流場;

(5)計算得到區域性動能場k(i);

(6)利用邊緣檢測演算法(如基於小波的方法)區域性動能場並分割影象得到不同的運動單元也理解為乙個運動單元);

(7)由於目標一般較背景小,故提取出體積較運動單元作為檢測目標;

(8)計算其質心作為目標位置;

(9)置i=i+1,重複(2)~(8),直至檢測結束。

基於光流場分析的運動目標檢測方法,不僅包含了被觀察物體的運動資訊,而且攜帶了三維結構的豐富資訊,因此它不僅可以用於運動目標檢測,還可以直接應用於運動目標跟蹤,能夠很精確的計算出運動目標的速度,同時在攝像機存在運動的情況下也能夠檢測出運動目標。而在實際的應用中,由於存在多光源、遮擋性、雜訊和透明性等多方面的原因,光流場基本方程中的灰度守恆這個假設條件是得不到滿足的,因此不能求解出正確的光流場,同時由於其採用的是迭代的求解計算方法,故需要的計算時間比較長,從而無法滿足實時的要求,並且該方法受雜訊的影響較大,因而該方法多適用於目標運動速度不大,影象雜訊比較小的情況。

**:cvcalcopticalflowpyrlk函式在使用時,首先要確定特徵點,也就是目標舊的位置。

本程式通過使用cvgoodfeaturestotrack函式選擇角點作為特徵點。

本程式只是乙個簡單的運動檢測,在具體應用過程中,可以根據自己的需要修正

#include

#include

int main (int argc,char **argv)

cvshowimage ("image", dst_img); 

cvwaitkey (1);

cvreleaseimage (&src_img1); 

cvreleaseimage (&src_img2);

cvreleaseimage (&eig_img);

cvreleaseimage (&temp_img); 

cvreleaseimage (&prev_pyramid); 

cvreleaseimage (&curr_pyramid);

}cvdestroywindow ("image");

cvreleaseimage (&dst_img);

cvreleaseimage(&pre_img);

return 0;

**:cvcalcopticalflowpyrlk需要確定特徵點。

本程式,通過幀差獲得運動的點作為特徵點。

本程式原本的目的是計算運動點的速度,通過修正可以進行運動跟蹤。

#include

#include

#include

usingnamespace std;

int const max_corners = 1000;

int main (int argc,char **argv)}}

}cvnamedwindow("moving object", 1);

cvshowimage("moving object", move_img);

cvsize pyrsize = cvsize(src_img1->width +8,src_img1->height/3);

iplimage * pyra = cvcreateimage(pyrsize, ipl_depth_32f, 1); //pyra是需要尋找的點,不是沒有初始化的

iplimage * pyrb = cvcreateimage(pyrsize, ipl_depth_32f, 1);

cvcalcopticalflowpyrlk(src_img1,

src_img2,

pyra,

pyrb,

move_old_point,

move_new_point,

countn,

cvsize(10, 10),

3,features_found,

features_error,

criteria,0);

for (i = 0;i < countn;i++)

}cvnamedwindow ("imagepyrlk", 1); 

cvshowimage ("imagepyrlk", dst_img);

cvwaitkey (1);

cvreleaseimage (&dst_img);

cvreleaseimage(&pyra);

cvreleaseimage(&pyrb);

cvreleaseimage(&move_img);

}cvdestroywindow("moving object");

cvdestroywindow ("imagepyrlk"); 

cvreleaseimage (&src_img1);

cvreleaseimage (&src_img2);

cvreleaseimage (&pre_img);

cvreleaseimage (&cur_img);

return 0;

1、 

2、 

3、 

4、 

5、 

給我老師的人工智慧教程打call!

運動目標檢測之「光流法」

opencv 光流法sample code 1950年,gibson首先提出了光流的概念,所謂光流就是指影象表現運動的速度。物體在運動的時候之所以能被人眼發現,就是因為當物體運動時,會在人的視網膜上形成一系列的連續變化的影象,這些變化資訊在不同時間,不斷的流過眼睛視網膜,就好像一種光流過一樣,故稱之...

目標檢測入門 幀差法,光流法和背景減法

運動目標檢測的方法有很多種。根據背景是否複雜 攝像機是否運動等環境的不同,演算法之間也有很大的差別。其中最常用的三類方法是 幀間差分法 背景減法 光流場法。下面對這三類方法進行介紹,通過實驗結果,對它們各自的演算法效能進行分析,為進一步的目標檢測演算法研究建立良好的基礎。幀間差分法 temporal...

運動目標檢測

目錄 檢測方法 背景模型 目標檢測 後處理 檢測方法 基於統計背景模型的運動目標檢測方法 問題 1 背景獲取 需要在場景存在運動目標的情況下獲得背景影象 2 背景擾動 背景中可以含有輕微擾動的物件,如樹枝 樹葉的搖動,擾動部分不應該被看做是前景運動目標 3 外界光照變化 一天中不同時間段光線 天氣等...