m分别使用meanshift和camshift两种算法实现人员跟踪并输出人员移动曲线matlab仿真
  lbWQrknXiYmG 2023年11月02日 61 0

1.算法仿真效果 matlab2022a仿真结果如下: 1.png2.png3.png

2.算法涉及理论知识概要 meanshift算法其实通过名字就可以看到该算法的核心,mean(均值),shift(偏移),简单的说,也就是有一个点 ,它的周围有很多个点 我们计算点 移动到每个点 所需要的偏移量之和,求平均,就得到平均偏移量,(该偏移量的方向是周围点分布密集的方向)该偏移量是包含大小和方向的。然后点 就往平均偏移量方向移动,再以此为新的起点不断迭代直到满足一定条件结束。

   中心点就是我们上面所说的  周围的小红点就是  黄色的箭头就是我们求解得到的平均偏移向量。那么图中“大圆圈”是什么东西呢?我们上面所说的周围的点  周围是个什么概念?总的有个东西来限制一下吧。那个“圆圈”就是我们的限制条件,或者说在图像处理中,就是我们搜索迭代时的窗口大小。不过在opencv中,我们一般用的是矩形窗口,而且是图像,2维的。这里其实不是圆,而是一个高维的球。

  步骤1、首先设定起始点  ,我们说了,是球,所以有半径  , 所有在球内的点就是  , 黑色箭头就是我们计算出来的向量  , 将所有的向量  进行求和计算平均就得到我们的meanshift 向量,也就是图中黄色的向量。

4.png5.png

   Camshift它是MeanShift算法的改进,称为连续自适应的MeanShift算法,CamShift算法的全称是"Continuously Adaptive Mean-SHIFT",它的基本思想是视频图像的所有帧作MeanShift运算,并将上一帧的结果(即Search Window的中心和大小)作为下一帧MeanShift算法的Search Window的初始值,如此迭代下去。

   Camshift 是由Meanshift 推导而来 Meanshift主要是用在单张影像上,但

是独立一张影像分析对追踪而言并无意义,Camshift 就是利用MeanShift的方 法,对影像串列进行分析。 (1) 首先在影像串列中选择ㄧ区域。 (2) 计算此区域的颜色2D几率分布。 (3) 用MeanShift演算法来收敛欲追踪的区域。 (4) 集中收敛的区域,并标示之。 (5) 每个frame重复(3)(4)。 Camshift 关键就在于当目标的大小发生改变的时候,此算法可以自适应调整目标区域继续跟踪。

Camshift算法是Continuously Adaptive Mean Shift algorithm的简称。

   它是一个基于MeanSift的改进算法。它首次由Gary R.Bradski等人提出和应用在人脸的跟踪上,并取得了不错的效果。因为它是利用颜色的概率信息进行的跟踪。使得它的执行效率比較高。 Camshift算法的过程由以下步骤组成:

(1)确定初始目标及其区域;

(2)计算出目标的色度(Hue)分量的直方图;

(3)利用直方图计算输入图像的反向投影图(后面做进一步的解释);

(4)利用MeanShift算法在反向投影图中迭代收索,直到其收敛或达到最大迭代次数。并保存零次矩。

(5)从第(4)步中获得收索窗体的中心位置和计算出新的窗体大小。以此为參数,进入到下一幀的目标跟踪。(即跳转到第(2)步);

3.MATLAB核心程序

PIX_Size                                         = [PIX.Width,PIX.Height];
Num_Frame                                        = floor(PIX.Duration * PIX.FrameRate);
Start_frame                                      = 120;
I0                                               = read(PIX,Start_frame);
[jishu,rect,a,b,m_wei,C,hist1,y,trace_x,trace_y] = select(I0); 
 
for Frm = Start_frame:Num_Frame 
    Frm
    Im    = read(PIX,Frm);
    jishu = jishu+1;
    num   = 0;
    Y     = [2,2];
    %将前一的结果作为下一次的初始值
    [rect,M00]  = func_meanshift(Y,Im,rect,a,b,num,m_wei,C,hist1,y);
    
    windowsize   = 2 * (M00/256)^.5;
    sidelength = sqrt(windowsize);
    
    v1=rect(1);
    v2=rect(2);
    v3=rect(3)+sidelength;
    v4=rect(4)+sidelength;
    trace_x = [trace_x v1 + v3/2];
    trace_y = [trace_y v2 + v4/2];
    %显示跟踪结果
    figure(2);
    imshow(uint8(Im))
    hold on;
    plot([v1,v1+v3],[v2,v2],[v1,v1],[v2,v2+v4],[v1,v1+v3],[v2+v4,v2+v4],[v1+v3,v1+v3],[v2,v2+v4],'LineWidth',2,'Color','y') 
    if jishu>2
       plot(trace_x(1:jishu-1),trace_y(1:jishu-1),'LineWidth',2,'Color','g');
    end
end

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  F36IaJwrKLcw   2023年12月23日   26   0   0 idesparkidesparkDataData
  FoZN5OJ14wRT   2023年11月28日   20   0   0 Luaideideluasedsed
  vv2O73UnQfVU   2023年11月12日   22   0   0 cisedideidecised
lbWQrknXiYmG