Mean shift和Cam shift算法原理和實現

一、Mean shift

在討論Mean Shift算法之前,首先討論在2D概率分佈圖像中,如何計算某個區域的重心(Mass Center)的問題,重心可以通過以下公式來計算:
1.計算區域內0階矩
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
     M00+=I(i,j)
2.區域內1階矩:
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
{
    M10+=i*I(i,j);
    M01+=j*I(i,j);
}
3.則Mass Center爲:
Xc=M10/M00; Yc=M01/M00


接下來,討論Mean Shift算法的具體步驟,Mean Shift算法可以分爲以下4步:
1.選擇窗的大小和初始位置.
2.計算此時窗口內的Mass Center.
3.調整窗口的中心到Mass Center.
4.重複2和3,直到窗口中心"會聚",即每次窗口移動的距離小於一定的閾值。

在OpenCV中,提供Mean Shift算法的函數,函數的原型是:
int cvMeanShift(IplImage* imgprob,CvRect windowIn,
                    CvTermCriteria criteria,CvConnectedComp* out);

需要的參數爲:
1.IplImage* imgprob:2D概率分佈圖像,傳入;
2.CvRect windowIn:初始的窗口,傳入;
3.CvTermCriteria criteria:停止迭代的標準,傳入;
4.CvConnectedComp* out:查詢結果,傳出。
(注:構造CvTermCriteria變量需要三個參數,一個是類型,另一個是迭代的最大次數,最後一個表示特定的閾值。例如可以這樣構造criteria:criteria=cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,10,0.1)。)

返回的參數:
1.int:迭代的次數。

實現代碼:暫時缺

二、.CamShift:

CamShift算法,OpenCV實現(3):CamShift算法

1.原理
在瞭解了MeanShift算法以後,我們將MeanShift算法擴展到連續圖像序列(一般都是指視頻圖像序列),這樣就形成了CamShift算法。CamShift算法的全稱是"Continuously Apaptive Mean-SHIFT",它的基本思想是視頻圖像的所有幀作MeanShift運算,並將上一幀的結果(即Search Window的中心和大小)作爲下一幀MeanShift算法的Search Window的初始值,如此迭代下去,就可以實現對目標的跟蹤。整個算法的具體步驟分5步:
Step 1:將整個圖像設爲搜尋區域。
Step 2:初始話Search Window的大小和位置。
Step 3:計算Search Window內的彩色概率分佈,此區域的大小比Search Window要稍微大一點。
Step 4:運行MeanShift。獲得Search Window新的位置和大小。
Step 5:在下一幀視頻圖像中,用Step 3獲得的值初始化Search Window的位置和大小。跳轉到Step 3繼續運行。

2.實現
在OpenCV中,有實現CamShift算法的函數,此函數的原型是:
cvCamShift(IplImage* imgprob, CvRect windowIn,
                CvTermCriteria criteria,
                CvConnectedComp* out, CvBox2D* box=0);
其中:
   imgprob:色彩概率分佈圖像。
   windowIn:Search Window的初始值。
   Criteria:用來判斷搜尋是否停止的一個標準。
   out:保存運算結果,包括新的Search Window的位置和麪積。
   box:包含被跟蹤物體的最小矩形。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章