CamShift演算法學習

2021-08-14 01:14:55 字數 2114 閱讀 9049

一直以為,camshift演算法就是cvcamshiftapi實現,經過幾天的學習。突然發現,camshift演算法其實包含3部分:獲取概率密度圖,找到概率密度圖的最大密度位置,最後迭代。這部分先參考:

opencv直方圖與匹配(二)——反向投影

學習!分享!感謝!

功能:在反向投影圖中發現目標中心。在給定反向投影和初始搜素視窗位置的情況下,用迭代方法尋找目標中心。當搜尋視窗中心的移動小於某個給定值時或者函式已經達到最大迭代次數時停止迭代。函式返回迭代次數。

int cvmeanshift( const cvarr* prob_image, cvrect window,

cvtermcriteria criteria, cvconnectedcomp* comp );

引數1:prob_image目標直方圖的反向投影

引數2:window初始搜素視窗

引數3:criteria確定視窗搜尋停止的準則

引數4:comp生成的結構,包含收斂的搜尋視窗座標(comp->rect)與視窗內部所有畫素點的和(comp->area欄位)

功能:發現目標中心、尺寸和方向

int cvcamshift( const cvarr* prob_image, cvrect window, cvtermcriteria criteria,

cvconnectedcomp* comp, cvbox2d* box=null );

引數1:prob_image目標直方圖的反向投影

引數2:window初始搜素視窗

引數3:criteria確定視窗搜尋停止的準則

引數4:comp生成的結構,包含收斂的搜尋視窗座標(comp->rect)與視窗內部所有畫素點的和(comp->area欄位)

引數5:box目標的帶邊界盒子。如果非null,則包含目標的尺寸和方向。cvcamshift呼叫函式cvmeanshift尋找目標中心,然後計算目標尺寸和方向。最後返回cvmeanshift中的迭代次數。

meanshift演算法就是利用概率密度的梯度爬公升來尋找區域性最優。它要做的就是輸入乙個在影象的範圍,然後一直迭代知道滿足要求。

int turns = cvcamshift (

imgbackprojection,

rectcamsw,

// x,y,width,height, cvrect, window to search over

cvtermcriteria

( cv_termcrit_eps | cv_termcrit_iter,20,

1),// criteria

&comptrack,

// x,y, width, height

&boxtrack

// cvbox2d newly resized box, criteria for next imgframe (as updated by tracker), center, size and angle

);

camshift利用目標的顏色直方圖,將影象轉換為顏色概率分布圖,初始化乙個搜尋窗的大小和位置,並根據上一幀得到的結果自適應調整搜尋視窗的位置和大小,從而定位出當前當前影象中目標的中心位置。

void  mixchannels (const mat*  src , int  nsrc , mat*  dst , int  ndst , const int*  

fromto , size_t npairs );

功能:把輸入的矩陣的某些通道拆分複製給對應的輸出矩陣的某些通道中。

opencv之mixchannels()函式使用說明

cv運動分析與物件跟蹤

基於meanshift的camshift演算法原理詳解(整理)

Opencv學習(Camshift跟蹤演算法)

今天跑了下opencv中的camshiift例程。因為camshift演算法需要自己用手標註跟蹤的物件,所以稍微標註不好,跟蹤的結果就不好。而且例程中跟蹤的色彩資訊,所以如果影象中的陰暗資訊多了,效果更差。本人修改後的演算法如下 ifdef ch pragma package endif defin...

Camshift演算法研究

根據獲得的色彩直方圖將原始影象轉化成色彩概率分布影象,這個過程就被稱作 back projection 在opencv 中的直方圖函式中,包含back projection 的函式,函式原型是 void cvcalcbackproject iplimage img,cvarr backproject...

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...