目标跟踪:CamShift算法
1.前言
camshift利用目標(biāo)的顏色直方圖模型將圖像轉(zhuǎn)換為顏色概率分布圖,初始化一個(gè)搜索窗的大小和位置,并根據(jù)上一幀得到的結(jié)果自適應(yīng)調(diào)整搜索窗口的位置和大小,從而定位出當(dāng)前圖像中目標(biāo)的中心位置。
camshift的核心步驟仍然是Meanshift,只是在距離相似性度量的基礎(chǔ)之上,又增加了圖像灰度相似性的度量。兩者共同作用,實(shí)現(xiàn)了目標(biāo)的跟蹤。
2.MeanShift
Meanshift作為一種有效地特征空間分析方法,在圖像濾波,圖像分割,物體跟蹤等方面都有廣泛的應(yīng)用。Meanshift算法的詳細(xì)介紹,可以參見PAMI 2002的paper[1]。
給定d維空間R的n個(gè)樣本點(diǎn) ,i=1,…,n,在空間中任選一點(diǎn)x,那么Mean Shift向量的基本形式定義為: ??
??? ? ?Sk是一個(gè)半徑為h的高維球區(qū)域,滿足以下關(guān)系的y點(diǎn)的集合:
k表示在這n個(gè)樣本點(diǎn)xi中,有k個(gè)點(diǎn)落入Sk區(qū)域中.
簡單的理解就是,在d維空間中,任選一個(gè)點(diǎn),然后以這個(gè)點(diǎn)為圓心,h為半徑做一個(gè)高維球,因?yàn)橛衐維,d可能大于2,所以是高維球。落在這個(gè)球內(nèi)的所有點(diǎn)和圓心都會(huì)產(chǎn)生一個(gè)向量,向量是以圓心為起點(diǎn)落在球內(nèi)的點(diǎn)位終點(diǎn)。然后把這些向量都相加。相加的結(jié)果就是Meanshift向量。
具體如下圖所示。其中黃色箭頭就是Mh(meanshift向量)。
再以meanshift向量的終點(diǎn)為圓心,再做一個(gè)高維的球。如下圖所以,重復(fù)以上步驟,就可得到一個(gè)meanshift向量。如此重復(fù)下去,meanshift算法可以收斂到概率密度最大得地方。也就是最稠密的地方。
最終的結(jié)果如下:
當(dāng)然,目前Meanshift研究多集中在非線性領(lǐng)域(核函數(shù)),基本推到可以參考博客[2]。
3.CamShift用于目標(biāo)跟蹤的原理與MATLAB仿真
camshift利用目標(biāo)的顏色直方圖模型將圖像轉(zhuǎn)換為顏色概率分布圖,初始化一個(gè)搜索窗的大小和位置,并根據(jù)上一幀得到的結(jié)果自適應(yīng)調(diào)整搜索窗口的位置和大小,從而定位出當(dāng)前圖像中目標(biāo)的中心位置。其具體步驟可以理解為三步:
1.色彩投影圖(反向投影)
(1)RGB顏色空間對(duì)光照亮度變化較敏感,為了減少此變化對(duì)跟蹤效果的影響,將圖像從RGB空間轉(zhuǎn)換到HSV空間。(2)對(duì)其中的H分量作直方圖,在直方圖中代表了不同H分量值出現(xiàn)的概率或者像素個(gè)數(shù),就是說可以查找出H分量大小為h的概率或者像素個(gè)數(shù),即得到了顏色概率查找表。
(3)將圖像中每個(gè)像素的值用其顏色出現(xiàn)的概率對(duì)替換,就得到了顏色概率分布圖。這個(gè)過程就叫反向投影,顏色概率分布圖是一個(gè)灰度圖像。
2.meanshift
meanshift算法是一種密度函數(shù)梯度估計(jì)的非參數(shù)方法,通過迭代尋優(yōu)找到概率分布的極值來定位目標(biāo)。計(jì)算搜索窗的質(zhì)心:(4)調(diào)整搜索窗大小,移動(dòng)搜索窗的中心到質(zhì)心,如果移動(dòng)距離大于預(yù)設(shè)的固定閾值,則重復(fù),直到搜索窗的中心與質(zhì)心間的移動(dòng)距離小于預(yù)設(shè)的固定閾值,或者循環(huán)運(yùn)算的次數(shù)達(dá)到某一最大值,停止計(jì)算。關(guān)于meanshift的收斂性證明可以google相關(guān)文獻(xiàn)。
3.camshift
將meanshift算法擴(kuò)展到連續(xù)圖像序列,就是camshift算法。它將視頻的所有幀做meanshift運(yùn)算,并將上一幀的結(jié)果,即搜索窗的大小和中心,作為下一幀meanshift算法搜索窗的初始值。如此迭代下去,就可以實(shí)現(xiàn)對(duì)目標(biāo)的跟蹤。算法過程為:
(1).初始化搜索窗
(2).計(jì)算搜索窗的顏色概率分布(反向投影)
(3).運(yùn)行meanshift算法,獲得搜索窗新的大小和位置。
(4).在下一幀視頻圖像中用(3)中的值重新初始化搜索窗的大小和位置,再跳轉(zhuǎn)到(2)繼續(xù)進(jìn)行。
camshift能有效解決目標(biāo)變形和遮擋的問題,對(duì)系統(tǒng)資源要求不高,時(shí)間復(fù)雜度低,在簡單背景下能夠取得良好的跟蹤效果。但當(dāng)背景較為復(fù)雜,或者有許多與目標(biāo)顏色相似像素干擾的情況下,會(huì)導(dǎo)致跟蹤失敗。因?yàn)樗鼏渭兊目紤]顏色直方圖,忽略了目標(biāo)的空間分布特性,所以這種情況下需加入對(duì)跟蹤目標(biāo)的預(yù)測算法。
4.matlab仿真
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Author: Ziheng H. Shen @Tsinghua Univ. %ObjectTrangking by CamShift @Digital Image Process Practice %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function camshift() clc; close all; clear;L = [150 116]; W = [100 73]; % For plotting motion Xpoints = []; Ypoints = []; binNum=128;NFrames = length(dir('./videoImage/*.jpg')); %計(jì)算圖片的數(shù)目 for frame = 1:NFramesfilename = sprintf('./videoImage/%02d.jpg', frame); %讀根目錄下的圖像名R = imread(filename);I = rgb2hsv(R); hue = I(:,:,1); % 提取色調(diào)信息hueDiscrete= uint8( hue/ max(hue(:))*(binNum-1));if frame==1pHist = calHistOfROI(hueDiscrete,L,W); %第一幀初始化,可以用交互elselambda = 0.9;pHist= pHist*lambda+(1-lambda)* calHistOfROI(hueDiscrete,L,W);%更新直方圖end%反投影probImage = Projection(hueDiscrete,pHist);probImage = probImage/max(probImage(:));%標(biāo)記矩形框probImage=drawRect( probImage,L,W);%imshow(probImage,[]); title(num2str(frame)); pause(0.1);%MeanShift[L,W] = Meanshift(probImage, L,W);t=L+W/2;xc=round(t(1));yc=round(t(2));% Output the centroid's coordinates%disp(sprintf('%3i: %3i, %3i', frame, xc, yc));Xpoints = [Xpoints xc];Ypoints = [Ypoints yc];S = drawRect(R,L,W);imshow(S);title(num2str(frame));pause(0.1); end plot(Xpoints,Ypoints, 'go' , Xpoints, Ypoints); axis([0 320 0 240]); end%% 計(jì)算ROI區(qū)域的直方圖 function probabilityHist = calHistOfROI(hue,L,W) minY = max([L(2),1]); maxY = min([L(2)+W(2)-1, size(hue,1)]); minX = max([L(1),1]); maxX = min([L(1)+W(1)-1, size(hue,2)]); roiVal = hue(minY:maxY,minX:maxX); probabilityHist = hist( double(roiVal(:)),double(0:max(hue(:)))); probabilityHist = probabilityHist/sum(probabilityHist); end%% 反向投影,將 hue 的像素映射為 對(duì)應(yīng)的 概率 function probImage = Projection(hue,pHist) %色調(diào)圖 ROI直方圖 probImage=zeros(size(hue)); [M,N]=size(hue); for r=1:Mfor c=1:NprobImage(r,c) = pHist(hue(r,c)+1); %色調(diào)值對(duì)應(yīng)的概率end end end function [newLocation,newWndSize] = Meanshift(pImage,location,wndSize) %% meanshift L = location; W = wndSize; count=0; while 1count = count+1;minY = max([L(2),1]);maxY = min([L(2)+W(2)-1, size(pImage,1)]);minX = max([L(1),1]);maxX = min([L(1)+W(1)-1, size(pImage,2)]);roiVal = pImage(minY:maxY,minX:maxX);[newLocation,isConverged,~,~,M00] = calCenterOfMax(roiVal,L);L = newLocation;if(isConverged )breakend end % 調(diào)整窗的大小??? %s = round(1.8 * sqrt(M00)); %newWndSize = [floor(1.2*s) s]; newWndSize = wndSize; disp('mean shift converged'); endfunction [newLocation,isConverged,M01,M10,M00]=calCenterOfMax(roiVal,location) % 計(jì)算roiVal區(qū)域的質(zhì)心,從而計(jì)算出新的窗口位置 M01=0; M10=0; M00=0; [M,N]=size(roiVal); for r=1:Mfor c=1:Nval=roiVal(r,c);M01=M01+r*val;M10=M10+c*val;M00=M00+val;end end xCenter = M10 / M00; yCenter =M01 / M00; xCenterOld = (size(roiVal,2)+1)/2; yCenterOld = (size(roiVal,1)+1)/2; displacement = [xCenter yCenter]-[xCenterOld yCenterOld]; t=abs(displacement)<2; isConverged = all(t); newLocation = location+round(displacement); endfunction imNew = drawRect(im,L,W)% 繪制矩形框 minY = max([L(2),1]); maxY = min([L(2)+W(2)-1, size(im,1)]); minX = max([L(1),1]); maxX = min([L(1)+W(1)-1, size(im,2)]); imNew = im; imNew(minY:minY+2,minX:maxX,:) = 0; imNew(maxY-2:maxY,minX:maxX,:) = 0; imNew(minY:maxY,minX:minX+2,:) = 0; imNew(minY:maxY,maxX-2:maxX,:) = 0; end輸出結(jié)果(0,1,10,20,30,40,50,60幀):
MeanShift重心移動(dòng)軌跡為:
4.參看資料
[1].Comaniciu, D. and P. Meer (2002). "Mean shift: A robust approach toward feature space analysis." Pattern Analysis and Machine Intelligence, IEEE Transactions on 24(5): 603-619.
[2].http://www.cnblogs.com/liqizhou/archive/2012/05/11/2495788.html
總結(jié)
以上是生活随笔為你收集整理的目标跟踪:CamShift算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenGL编程指南6:顶点数组
- 下一篇: 爱国者首款手机正式上市 零售价不超200