一直都覺得粒子濾波是個挺牛的東西,每次試圖看文獻都被複雜的數學符號搞得看不下去。一個偶然的機會發現了Rob Hess(http://web.engr.oregonstate.edu/~hess/)實現的這個粒子濾波。從代碼入手,一下子就明白了粒子濾波的原理。根據維基百科上對粒子濾波的介紹(http://en.wikipedia.org/wiki/Particle_filter),粒子濾波其實有很多變種,Rob Hess實現的這種應該是最基本的一種,Sampling Importance Resampling
(SIR),根據重要性重採樣。下面是我對粒子濾波實現物體跟蹤的演算法原理的粗淺理解:
1)初始化階段-提取跟蹤目標特徵
該階段要人工指定跟蹤目標,程式計算跟蹤目標的特徵,比如可以採用目標的顏色特徵。具體到Rob Hess的代碼,開始時需要人工用滑鼠拖動出一個跟蹤地區,然後程式自動計算該地區色調(Hue)空間的長條圖,即為目標的特徵。長條圖可以用一個向量來表示,所以目標特徵就是一個N*1的向量V。
2)搜尋階段-放狗
好,我們已經掌握了目標的特徵,下面放出很多條狗,去搜尋目標對象,這裡的狗就是粒子particle。狗有很多种放法。比如,a)均勻的放:即在整個映像平面均勻的撒粒子(uniform distribution);b)在上一幀得到的目標附近按照高斯分布來放,可以理解成,靠近目標的地方多放,遠離目標的地方少放。Rob Hess的代碼用的是後一種方法。狗放出去後,每條狗怎麼搜尋目標呢?就是按照初始化階段得到的目標特徵(色調長條圖,向量V)。每條狗計算它所處的位置處映像的顏色特徵,得到一個色調長條圖,向量Vi,計算該長條圖與目標長條圖的相似性。相似性有多種度量,最簡單的一種是計算sum(abs(Vi-V)).每條狗算出相似性後再做一次歸一化,使得所有的狗得到的相似性加起來等於1.
3)決策階段
我們放出去的一條條聰明的狗向我們發回報告,“一號狗處映像與目標的相似性是0.3”,“二號狗處映像與目標的相似性是0.02”,“三號狗處映像與目標的相似性是0.0003”,“N號狗處映像與目標的相似性是0.013”...那麼目標究竟最可能在哪裡呢?我們做次加權平均吧。設N號狗的映像像素座標是(Xn,Yn),它報告的相似性是Wn,於是目標最可能的像素座標X = sum(Xn*Wn),Y = sum(Yn*Wn).
4)重採樣階段Resampling
既然我們是在做目標跟蹤,一般說來,目標是跑來跑去亂動的。在新的一幀映像裡,目標可能在哪裡呢?還是讓我們放狗搜尋吧。但現在應該怎樣放狗呢?讓我們重溫下狗狗們的報告吧。“一號狗處映像與目標的相似性是0.3”,“二號狗處映像與目標的相似性是0.02”,“三號狗處映像與目標的相似性是0.0003”,“N號狗處映像與目標的相似性是0.013”...綜合所有狗的報告,一號狗處的相似性最高,三號狗處的相似性最低,於是我們要重新分配警力,正所謂好鋼用在刀刃上,我們在相似性最高的狗那裡放更多條狗,在相似性最低的狗那裡少放狗,甚至把原來那條狗也撤回來。這就是Sampling
Importance Resampling,根據重要性重採樣(更具重要性重新放狗)。
(2)->(3)->(4)->(2)如是反覆迴圈,即完成了目標的動態跟蹤。
根據我的粗淺理解,粒子濾波的核心思想是隨機採樣+重要性重採樣。既然我不知道目標在哪裡,那我就隨機的撒粒子吧。撒完粒子後,根據特徵相似性計算每個粒子的重要性,然後在重要的地方多撒粒子,不重要的地方少撒粒子。所以說粒子濾波較之蒙特卡洛濾波,計算量較小。這個思想和RANSAC演算法真是不謀而合。RANSAC的思想也是(比如用在最簡單的直線擬合上),既然我不知道直線方程是什麼,那我就隨機的取兩個點先算個直線出來,然後再看有多少點符合我的這條直線。哪條直線能獲得最多的點的支援,哪條直線就是目標直線。想法非常簡單,但效果很好。
扯遠了,下面還是說說代碼吧。Rob Hess的代碼好像是linux上的,我稍微改了下,讓Windows+VS2008能跑。main函數在track1.c裡,預設是處理附帶的視頻,當然可以方便的改成從網路攝影機輸入視頻(cvCaptureFromCAM)。我用的是opencv2.0,沒有測試低於2.0的版本。程式開始後,讀入第一幀映像後,需要用滑鼠拖動出跟蹤目的地區域,(然後按斷行符號)。跟蹤地區較小時速度較快,跟蹤地區大時明顯變得很卡。代碼還需要gsl庫的支援,我用的是gsl1.8,下面提供了gsl1.8安裝檔案的下載。這裡是全部代碼和相關的VS2008工程檔案
轉載:http://www.cnblogs.com/yangyangcv/archive/2010/05/23/1742263.html