目标跟踪:CamShift算法
来源:互联网 发布:穿淘宝爆款 编辑:程序博客网 时间:2024/05/17 01:33
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 motionXpoints = []; Ypoints = [];binNum=128;NFrames = length(dir('./videoImage/*.jpg')); %计算图片的数目for frame = 1:NFrames filename = sprintf('./videoImage/%02d.jpg', frame); %读根目录下的图像名 R = imread(filename); I = rgb2hsv(R); hue = I(:,:,1); % 提取色调信息 hueDiscrete= uint8( hue/ max(hue(:))*(binNum-1)); if frame==1 pHist = calHistOfROI(hueDiscrete,L,W); %第一帧初始化,可以用交互 else lambda = 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);endplot(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:M for c=1:N probImage(r,c) = pHist(hue(r,c)+1); %色调值对应的概率 endendendfunction [newLocation,newWndSize] = Meanshift(pImage,location,wndSize) %% meanshiftL = location;W = wndSize;count=0;while 1 count = 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 ) break endend% 调整窗的大小???%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:M for c=1:N val=roiVal(r,c); M01=M01+r*val; M10=M10+c*val; M00=M00+val; endendxCenter = 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算法
- 目标跟踪方法--CamShift 算法
- OpenCV目标跟踪(三)-camshift算法
- 目标跟踪Camshift算法(Opencv实现)
- CamShift 目标跟踪算法研究(转)
- Opencv目标跟踪—CamShift算法
- camShift实现目标跟踪
- 目标跟踪--CamShift
- Camshift目标跟踪
- 【opencv】Camshift目标跟踪
- 目标跟踪:Meanshift, Camshift
- 运动目标跟踪与检测的源代码(CAMSHIFT 算法)
- 运动目标跟踪与检测的源代码(CAMSHIFT 算法)
- 显示如何利用Camshift算法进行彩色目标的跟踪
- 运动目标跟踪与检测的源代码(CAMSHIFT 算法)
- 用Camshift算法对指定目标进行跟踪
- OpenCV:利用Camshift算法进行彩色目标的跟踪
- Opencv目标跟踪—CamShift和meanshift算法
- NYOJ 43 —24 Point game
- Introduction_to_Algorithms_7
- WEB概述
- [Spring实战系列]
- 利用ffmpeg一步一步编程实现摄像头采集编码推流直播系统
- 目标跟踪:CamShift算法
- 【Bzoj2819】Nim
- Mycat常见问题与解决方案---宜将剩勇追穷寇,不可沽名学霸王
- hdu 2604(WA)
- 2.addTwoNumbers
- 算法导论 练习题 3.1-2
- Codeforces Round #352 (Div. 1) B. Robin Hood
- qt获取IP、网关地址
- sql where 1=1和 0=1 的作用