1.算法仿真效果
matlab2022a仿真结果如下:
2.算法涉及理论知识概要
meanshift算法其实通过名字就可以看到该算法的核心,mean(均值),shift(偏移),简单的说,也就是有一个点 ,它的周围有很多个点 我们计算点 移动到每个点 所需要的偏移量之和,求平均,就得到平均偏移量,(该偏移量的方向是周围点分布密集的方向)该偏移量是包含大小和方向的。然后点 就往平均偏移量方向移动,再以此为新的起点不断迭代直到满足一定条件结束。
中心点就是我们上面所说的 周围的小红点就是 黄色的箭头就是我们求解得到的平均偏移向量。那么图中“大圆圈”是什么东西呢?我们上面所说的周围的点 周围是个什么概念?总的有个东西来限制一下吧。那个“圆圈”就是我们的限制条件,或者说在图像处理中,就是我们搜索迭代时的窗口大小。不过在opencv中,我们一般用的是矩形窗口,而且是图像,2维的。这里其实不是圆,而是一个高维的球。
步骤1、首先设定起始点 ,我们说了,是球,所以有半径 , 所有在球内的点就是 , 黑色箭头就是我们计算出来的向量 , 将所有的向量 进行求和计算平均就得到我们的meanshift 向量,也就是图中黄色的向量。
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 = VideoReader('vedios.avi'); 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
标签:PIX,trace,算法,meanshift,v1,v2,matlab,rect,camshift From: https://www.cnblogs.com/51matlab/p/17366000.html