目標跟蹤演算法 Camshift函式 學習筆記

2021-08-21 09:13:15 字數 4081 閱讀 6014

在這一節中,主要講目標跟蹤的乙個重要的演算法camshift,因為它是連續自使用的meanshift,所以這2個函式opencv中都有,且都很重要。為了讓大家先達到乙個感性認識。這節主要是看懂和執行opencv中給的sample並稍加修改。

camshift函式的原型為:rotatedrect camshift(inputarrayprobimage, rect&window, termcriteriacriteria)。

其中probimage為輸入影象直方圖的反向投影圖,window為要跟蹤目標的初始位置矩形框,criteria為演算法結束條件。函式返回乙個有方向角度的矩陣。該函式的實現首先是利用meanshift演算法計算出要跟蹤的中心,然後調整初始視窗的大小位置和方向角度。在camshift內部呼叫了meanshift演算法計算目標的重心。

一、概括:

二、演算法

具體步驟如下:

步驟二:根據獲得的顏色直方圖將原始輸入影象轉化成顏色概率分布影象,

該過程稱為「反向投影"。所謂直方圖反向投影,就是輸入影象在已知目標顏色直方圖的條件下的顏色概率密度分布圖,包含了目標在當前幀中的相干資訊。對於輸入影象中的每乙個畫素,查詢目標模型顏色直方圖,對於目標區域內的畫素,可得到該畫素屬於目標畫素的概率,而對於非目標區域內的畫素,該概率為0。

步驟三:mean shift迭代過程。

即右邊大矩形框內的部分,它是 camshift 演算法的核心,目的在於找到目標中心在當前幀中的位置。首先在顏色概率分布圖中選擇搜尋視窗的大小和初始位置,然後計算搜尋視窗的質心位置。設畫素點(i, j)位於搜尋視窗內,i(i, j)是顏色直方圖的反向投影圖中該畫素點對應的值,定義搜尋視窗的零階矩 m00 和一階矩m10,m01如下:

則搜尋視窗的質心位置為:(m10/m00, m01/m00)。

接著調整搜尋視窗中心到質心。零階矩反映了搜尋視窗尺寸,依據它調整視窗大小,並將搜尋視窗的中心移到質心,如果移動距離大於設定的閾值,則重新計算調整後的視窗質心,進行新一輪的視窗位置和尺寸調整。直到視窗中心與質心之間的移動距離小於閾值,或者迭代次數達到某一最大值,認為收斂條件滿足,將搜尋視窗位置和大小作為下一幀的目標位置輸入,開始對下一幀影象進行新的目標搜尋。

三、總結    

camshift演算法改進了 mean-shift 跟蹤演算法的第二個缺陷,在跟蹤過程中能夠依

四、程式流程:

1、開啟攝像頭

2、顯示幫助資訊:

3、滑鼠響應:當滑鼠左鍵按下時,儲存此時的座標origion= pont(x,y),並且

selectobject=1;執行if裡面的語句,selection儲存滑鼠選擇區域,當鼠

標鬆開時,selectobject=0,trackobject=-1。

4、如果沒有按下暫停鍵」c」,影象由bgr轉化為hsv,inrange()將hsv中的

(0-180,30-256,10-256)儲存在mask中,分離h通道並儲存在hue中。

5、如果滑鼠選擇區域鬆開後,根據滑鼠的選擇區域計算直方圖並且歸一化到

0-255,將selection區域儲存在trackwindow中,且track object=1。

6、繪製目標區域的方向投影的直方圖:建立buf(1*16的3通道矩陣,並賦值

為(0-168,255,255),以這個漸變的顏色作為直方圖的色彩顯示。)

7、計算反向投影,,就是首先計算影象中的某一特徵,然後根據特徵尋找影象中

存在的特徵。

8、目標跟蹤:camshift函式返回乙個有方向角度的矩陣。該函式的實現首先是

利用meanshift演算法計算出要跟蹤的中心,然後調整初始視窗的大小位置和方

向角度。在camshift內部呼叫了meanshift演算法計算目標的重心。

9、如果跟蹤的矩形框的面積小於1,重新定義跟蹤視窗,否則保持不變

10、轉化為bgr,並繪製出橢圓形狀,如果繼續跟蹤,轉到步奏8。

函式解釋:

1、inrange(hsv,scalar(0,smin,min(_vmin,-vmax)),scalar(180,256,max(_vmin,-vm

ax)),mask):檢查元素的取值範圍是否在另兩個矩陣的元素取值之間,返回ma

sk驗證矩陣。

2、mixchannels(&hsv,1,&hue,1.ch,1):抽取 hsv影象中的通道0

&hsv:一系列輸入影象的陣列, 被拷貝的通道的**

1:輸入陣列中影象的數目

&hue:一系列目的影象的陣列, 儲存拷貝的通道

1:目的陣列中影象的數目

ch = :通道索引對的陣列,指示如何將輸入影象的某一通道拷貝到目的

影象的某一通道。在這裡,&hsv影象的hue(0) 通道被拷貝到&hue影象(單

通道)的0 通道。

1:通道索引對德數目

3、roi(hue,selection):設定hue中的感興趣區域,如果設定了感興趣區域,那麼在使

用opencv函式的時候,只會對roi區域操作,其它區域忽略。

4、maskroi(mask,selection):掩碼

5、calchist(&roi,1,0,maskroi,hist,1,&hist,&phranges):計算直方圖

&roi:輸入影象

1:第乙個引數中存放了多少張影象

0:需要統計的通道索引

maskroi:輸入影象的mask,可選的操作掩碼,這裡的非零掩碼元素用於標記出統計直方圖的陣列元素資料

hist:,輸出的目標直方圖

1:需要計算的直方圖的維度

&hist:存放每個維度的直方圖尺寸的陣列

&phranges:每一維數取值範圍。

6、normalize(hist,hist,0,255,cv_minmax):歸一化

7、rectangle(histimg,point(i*binw,histimg.rows),point((i+1)*binw),histimg.rows-val),s

calar(buf.at(i),-1,8);

c++: void rectangle(mat& img,point pt1, pointpt2, const scalar&color, intthickness=1,intlinetype=8, intshift=0)

c++: void rectangle(mat& img,rect rec, const scalar&color, intthickness=1, intlinetype=8,intshift=0 )

img – 畫矩形的物件 

pt1 – 矩形的乙個頂點,左上角的.

pt2 – 另乙個頂點,右下角的. 

rec – 確定矩形的另一種方式,給左上角座標和長寬 

color – 指定矩形的顏色或亮度(灰度影象)

thickness – 矩形邊框的粗細. 負值(like cv_filled)表示要畫乙個填充的矩形 

linetype – 邊框線型. 

8 (or 0) - 8-connected line(8鄰接)連線線。4 - 4-connected line(4鄰接)連線線。cv_aa - antialiased 線條。

8、calcbackproject(&hue,1,0,hist,backproj,&phranges)

hue:輸入影象

1:輸入影象的個數

0:需要統計的通道索引

hist:輸入的直方圖

backproj:目標反向投影陣列,必須為單通道

phranges:每乙個維度陣列的邊界

9、camshift(backproj,trackwindow,tercriteria(cv_termcrit_eps | 

cv_termcrit_iter,10,1))

backproj:輸入影象直方圖的反向投影圖

trackwindow:跟蹤目標的初始位置矩形框

tercriteria(cv_termcrit_eps | cv_termcrit_iter,10,1):演算法結束條件

Camshift目標跟蹤

camshift演算法是continuously adaptive mean shift algorithm的簡稱。它是乙個基於meansift的改進演算法。它首次由gary r.bradski等人提出和應用在人臉的跟蹤上,並取得了不錯的效果。由於它是利用顏色的概率資訊進行的跟蹤,使得它的執行效率比...

目標跟蹤方法 CamShift 演算法

一 概述 二 演算法流程 具體步驟如下 步驟二 根據獲得的顏色直方圖將原始輸入影象轉化成顏色概率分布影象,該過程稱為 反向投影 所謂直方圖反向投影,就是輸入影象在已知目標顏色直方圖的條件下的顏色概率密度分布圖,包含了目標在當前幀中的相干資訊。對於輸入影象中的每乙個畫素,查詢目標模型顏色直方圖,對於目...

CamShift跟蹤演算法

ifdef ch pragma package opencv endif define cv no backward compatibility ifndef eic include cv.h include highgui.h include stdio.h include ctype.h end...