日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

目标跟踪:CamShift算法

發布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 目标跟踪:CamShift算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.前言

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

camshift的核心步驟仍然是Meanshift,只是在距離相似性度量的基礎之上,又增加了圖像灰度相似性的度量。兩者共同作用,實現了目標的跟蹤。

2.MeanShift

Meanshift作為一種有效地特征空間分析方法,在圖像濾波,圖像分割,物體跟蹤等方面都有廣泛的應用。Meanshift算法的詳細介紹,可以參見PAMI 2002的paper[1]。

給定d維空間R的n個樣本點 ,i=1,…,n,在空間中任選一點x,那么Mean Shift向量的基本形式定義為: ??

??? ? ?

Sk是一個半徑為h的高維球區域,滿足以下關系的y點的集合:


k表示在這n個樣本點xi中,有k個點落入Sk區域中.

簡單的理解就是,在d維空間中,任選一個點,然后以這個點為圓心,h為半徑做一個高維球,因為有d維,d可能大于2,所以是高維球。落在這個球內的所有點和圓心都會產生一個向量,向量是以圓心為起點落在球內的點位終點。然后把這些向量都相加。相加的結果就是Meanshift向量。
具體如下圖所示。其中黃色箭頭就是Mh(meanshift向量)。


再以meanshift向量的終點為圓心,再做一個高維的球。如下圖所以,重復以上步驟,就可得到一個meanshift向量。如此重復下去,meanshift算法可以收斂到概率密度最大得地方。也就是最稠密的地方。


最終的結果如下:


當然,目前Meanshift研究多集中在非線性領域(核函數),基本推到可以參考博客[2]。

3.CamShift用于目標跟蹤的原理與MATLAB仿真

camshift利用目標的顏色直方圖模型將圖像轉換為顏色概率分布圖,初始化一個搜索窗的大小和位置,并根據上一幀得到的結果自適應調整搜索窗口的位置和大小,從而定位出當前圖像中目標的中心位置。其具體步驟可以理解為三步:

1.色彩投影圖(反向投影)

(1)RGB顏色空間對光照亮度變化較敏感,為了減少此變化對跟蹤效果的影響,將圖像從RGB空間轉換到HSV空間。

(2)對其中的H分量作直方圖,在直方圖中代表了不同H分量值出現的概率或者像素個數,就是說可以查找出H分量大小為h的概率或者像素個數,即得到了顏色概率查找表。

(3)將圖像中每個像素的值用其顏色出現的概率對替換,就得到了顏色概率分布圖。這個過程就叫反向投影,顏色概率分布圖是一個灰度圖像。

2.meanshift

meanshift算法是一種密度函數梯度估計的非參數方法,通過迭代尋優找到概率分布的極值來定位目標。計算搜索窗的質心:

(4)調整搜索窗大小,移動搜索窗的中心到質心,如果移動距離大于預設的固定閾值,則重復,直到搜索窗的中心與質心間的移動距離小于預設的固定閾值,或者循環運算的次數達到某一最大值,停止計算。關于meanshift的收斂性證明可以google相關文獻。

3.camshift

將meanshift算法擴展到連續圖像序列,就是camshift算法。它將視頻的所有幀做meanshift運算,并將上一幀的結果,即搜索窗的大小和中心,作為下一幀meanshift算法搜索窗的初始值。如此迭代下去,就可以實現對目標的跟蹤。
算法過程為:
(1).初始化搜索窗
(2).計算搜索窗的顏色概率分布(反向投影)
(3).運行meanshift算法,獲得搜索窗新的大小和位置。
(4).在下一幀視頻圖像中用(3)中的值重新初始化搜索窗的大小和位置,再跳轉到(2)繼續進行。

camshift能有效解決目標變形和遮擋的問題,對系統資源要求不高,時間復雜度低,在簡單背景下能夠取得良好的跟蹤效果。但當背景較為復雜,或者有許多與目標顏色相似像素干擾的情況下,會導致跟蹤失敗。因為它單純的考慮顏色直方圖,忽略了目標的空間分布特性,所以這種情況下需加入對跟蹤目標的預測算法。

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')); %計算圖片的數目 for frame = 1:NFramesfilename = sprintf('./videoImage/%02d.jpg', frame); %讀根目錄下的圖像名R = imread(filename);I = rgb2hsv(R); hue = I(:,:,1); % 提取色調信息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(:));%標記矩形框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%% 計算ROI區域的直方圖 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 的像素映射為 對應的 概率 function probImage = Projection(hue,pHist) %色調圖 ROI直方圖 probImage=zeros(size(hue)); [M,N]=size(hue); for r=1:Mfor c=1:NprobImage(r,c) = pHist(hue(r,c)+1); %色調值對應的概率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 % 調整窗的大小??? %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) % 計算roiVal區域的質心,從而計算出新的窗口位置 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輸出結果(0,1,10,20,30,40,50,60幀):


MeanShift重心移動軌跡為:


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

總結

以上是生活随笔為你收集整理的目标跟踪:CamShift算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。