基于粒子滤波的物体跟踪
一直都覺得粒子濾波是個(gè)挺牛的東西,每次試圖看文獻(xiàn)都被復(fù)雜的數(shù)學(xué)符號(hào)搞得看不下去。一個(gè)偶然的機(jī)會(huì)發(fā)現(xiàn)了Rob Hess(http://web.engr.oregonstate.edu/~hess/)實(shí)現(xiàn)的這個(gè)粒子濾波。從代碼入手,一下子就明白了粒子濾波的原理。根據(jù)維基百科上對(duì)粒子濾波的介紹(http://en.wikipedia.org/wiki/Particle_filter),粒子濾波其實(shí)有很多變種,Rob Hess實(shí)現(xiàn)的這種應(yīng)該是最基本的一種,Sampling Importance Resampling (SIR),根據(jù)重要性重采樣。下面是我對(duì)粒子濾波實(shí)現(xiàn)物體跟蹤的算法原理的粗淺理解:
1)初始化階段-提取跟蹤目標(biāo)特征
該階段要人工指定跟蹤目標(biāo),程序計(jì)算跟蹤目標(biāo)的特征,比如可以采用目標(biāo)的顏色特征。具體到Rob Hess的代碼,開始時(shí)需要人工用鼠標(biāo)拖動(dòng)出一個(gè)跟蹤區(qū)域,然后程序自動(dòng)計(jì)算該區(qū)域色調(diào)(Hue)空間的直方圖,即為目標(biāo)的特征。直方圖可以用一個(gè)向量來(lái)表示,所以目標(biāo)特征就是一個(gè)N*1的向量V。
2)搜索階段-放狗
好,我們已經(jīng)掌握了目標(biāo)的特征,下面放出很多條狗,去搜索目標(biāo)對(duì)象,這里的狗就是粒子particle。狗有很多種放法。比如,a)均勻的放:即在整個(gè)圖像平面均勻的撒粒子(uniform distribution);b)在上一幀得到的目標(biāo)附近按照高斯分布來(lái)放,可以理解成,靠近目標(biāo)的地方多放,遠(yuǎn)離目標(biāo)的地方少放。Rob Hess的代碼用的是后一種方法。狗放出去后,每條狗怎么搜索目標(biāo)呢?就是按照初始化階段得到的目標(biāo)特征(色調(diào)直方圖,向量V)。每條狗計(jì)算它所處的位置處圖像的顏色特征,得到一個(gè)色調(diào)直方圖,向量Vi,計(jì)算該直方圖與目標(biāo)直方圖的相似性。相似性有多種度量,最簡(jiǎn)單的一種是計(jì)算sum(abs(Vi-V)).每條狗算出相似度后再做一次歸一化,使得所有的狗得到的相似度加起來(lái)等于1.
3)決策階段
我們放出去的一條條聰明的狗向我們發(fā)回報(bào)告,“一號(hào)狗處圖像與目標(biāo)的相似度是0.3”,“二號(hào)狗處圖像與目標(biāo)的相似度是0.02”,“三號(hào)狗處圖像與目標(biāo)的相似度是0.0003”,“N號(hào)狗處圖像與目標(biāo)的相似度是0.013”...那么目標(biāo)究竟最可能在哪里呢?我們做次加權(quán)平均吧。設(shè)N號(hào)狗的圖像像素坐標(biāo)是(Xn,Yn),它報(bào)告的相似度是Wn,于是目標(biāo)最可能的像素坐標(biāo)X = sum(Xn*Wn),Y = sum(Yn*Wn).
4)重采樣階段Resampling
既然我們是在做目標(biāo)跟蹤,一般說(shuō)來(lái),目標(biāo)是跑來(lái)跑去亂動(dòng)的。在新的一幀圖像里,目標(biāo)可能在哪里呢?還是讓我們放狗搜索吧。但現(xiàn)在應(yīng)該怎樣放狗呢?讓我們重溫下狗狗們的報(bào)告吧。“一號(hào)狗處圖像與目標(biāo)的相似度是0.3”,“二號(hào)狗處圖像與目標(biāo)的相似度是0.02”,“三號(hào)狗處圖像與目標(biāo)的相似度是0.0003”,“N號(hào)狗處圖像與目標(biāo)的相似度是0.013”...綜合所有狗的報(bào)告,一號(hào)狗處的相似度最高,三號(hào)狗處的相似度最低,于是我們要重新分布警力,正所謂好鋼用在刀刃上,我們?cè)谙嗨贫茸罡叩墓纺抢锓鸥鄺l狗,在相似度最低的狗那里少放狗,甚至把原來(lái)那條狗也撤回來(lái)。這就是Sampling Importance Resampling,根據(jù)重要性重采樣(更具重要性重新放狗)。
(2)->(3)->(4)->(2)如是反復(fù)循環(huán),即完成了目標(biāo)的動(dòng)態(tài)跟蹤。
?
根據(jù)我的粗淺理解,粒子濾波的核心思想是隨機(jī)采樣+重要性重采樣。既然我不知道目標(biāo)在哪里,那我就隨機(jī)的撒粒子吧。撒完粒子后,根據(jù)特征相似度計(jì)算每個(gè)粒子的重要性,然后在重要的地方多撒粒子,不重要的地方少撒粒子。所以說(shuō)粒子濾波較之蒙特卡洛濾波,計(jì)算量較小。這個(gè)思想和RANSAC算法真是不謀而合。RANSAC的思想也是(比如用在最簡(jiǎn)單的直線擬合上),既然我不知道直線方程是什么,那我就隨機(jī)的取兩個(gè)點(diǎn)先算個(gè)直線出來(lái),然后再看有多少點(diǎn)符合我的這條直線。哪條直線能獲得最多的點(diǎn)的支持,哪條直線就是目標(biāo)直線。想法非常簡(jiǎn)單,但效果很好。
?
扯遠(yuǎn)了,下面還是說(shuō)說(shuō)代碼吧。Rob Hess的代碼好像是linux上的,我稍微改了下,讓W(xué)indows+VS2008能跑。main函數(shù)在track1.c里,默認(rèn)是處理附帶的視頻,當(dāng)然可以方便的改成從攝像頭輸入視頻(cvCaptureFromCAM)。我用的是opencv2.0,沒有測(cè)試低于2.0的版本。程序開始后,讀入第一幀圖像后,需要用鼠標(biāo)拖動(dòng)出跟蹤目標(biāo)區(qū)域,(然后按回車)。跟蹤區(qū)域較小時(shí)速度較快,跟蹤區(qū)域大時(shí)明顯變得很卡。代碼還需要gsl庫(kù)的支持,我用的是gsl1.8,下面提供了gsl1.8安裝文件的下載。這里是全部代碼和相關(guān)的VS2008工程文件
?
Hope you find it useful!
?
轉(zhuǎn)載于:https://www.cnblogs.com/yangyangcv/archive/2010/05/23/1742263.html
總結(jié)
以上是生活随笔為你收集整理的基于粒子滤波的物体跟踪的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP调用外部服务获取IP地域信息实现信
- 下一篇: 桶排序及其应用