meanshift优缺点和算法代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

meanshift 做跟踪的优缺点及其代码

(2012-03-28 12:45:16)

转载▼

标签:

转载

原文地址:meanshift 做跟踪的优缺点及其代码作者:千里8848

meanShift算法用于视频目标跟踪时,采用目标的颜色直方图作为搜索特征,通过不断迭代meanShift向量使得算法收敛于目标的真实位置,从而达到跟踪的目的。

传统的meanShift算法在跟踪中有几个优势:

(1)算法计算量不大,在目标区域已知的情况下完全可以做到实时跟踪;

(2)采用核函数直方图模型,对边缘遮挡、目标旋转、变形和背景运动不敏感。

同时,meanShift算法也存在着以下一些缺点:

(1)缺乏必要的模板更新;

(2)跟踪过程中由于窗口宽度大小保持不变,当目标尺度有所变化时,跟踪就会失败;(3)当目标速度较快时,跟踪效果不好;

(4)直方图特征在目标颜色特征描述方面略显匮乏,缺少空间信息;

由于其计算速度快,对目标变形和遮挡有一定的鲁棒性,所以,在目标跟踪领域,meanShift 算法目前依然受到大家的重视。但考虑到其缺点,在工程实际中也可以对其作出一些改进和调整;例如:

(1)引入一定的目标位置变化的预测机制,从而更进一步减少meanShift跟踪的搜索时间,降低计算量;

(2)可以采用一定的方式来增加用于目标匹配的“特征”;

(3)将传统meanShift算法中的核函数固定带宽改为动态变化的带宽;

(4)采用一定的方式对整体模板进行学习和更新;

代码如下,使用方法:先圈出要跟踪对象的初始位置,然后双击。输入为图片序列。

/////////////////////////////////////////////////////////////////////////////////////////// close all;

clear all;

rgb = imread('0015.jpeg');

figure(1);

imshow(rgb);

[temp,rect] = imcrop(rgb);%交互式切图

[a,b,c] = size(temp);

%中心点位置

y(1) = a/2;

y(2) = b/2;

%带宽

h = y(1)^2 + y(2)^2;

%用epanechnikov计算权值矩阵

t_weight = zeros(a,b);

for i = 1:a

for j = 1:b

dist = (i - y(1))^2 + (j - y(2))^2;

t_weight(i,j) = 1 - dist/h;

end

end

%归一化系数

C = 1/sum(sum(t_weight));

%计算跟踪目标直方图,16*16*16 bins

hist1 = zeros(1,4096);

for i = 1:a

for j = 1:b

t_r = fix(double(temp(i,j,1))/16);

t_g = fix(double(temp(i,j,2))/16);

t_b = fix(double(temp(i,j,3))/16);

位颜色

t_color = 256*t_r + 16*t_g + t_b;

hist1(t_color + 1) = hist1(t_color + 1) + t_weight(i,j);

end

end

hist1 = C*hist1; %归一化直方图

%读取待跟踪序列

for k = 0015:0053

Im = imread(['00',num2str(k),'.jpeg']);

num = 0; %迭代次数

Y = [2,2]; %移动向量

%meanshift迭代

while ((Y(1)^2 + Y(2)^2)>0.5) & (num < 20)

num = num + 1;

temp1=imcrop(Im,rect);

hist2 = zeros(1,4096);%候选区域直方图

for i = 1:a

for j = 1:b

m_r = fix(double(temp1(i,j,1))/16);

m_g = fix(double(temp1(i,j,2))/16);

m_b = fix(double(temp1(i,j,3))/16);

m_color(i,j) = 256*m_r + 16*m_g + m_b;

hist2(m_color(i,j) + 1) = hist2(m_color(i,j) + 1) + t_weight(i,j); end

end

hist2 = C * hist2;

w = weight(hist1,hist2);

%计算移动量

sum_w = 0;

xw = [0 0];

for i = 1:a

for j = 1:b

sum_w = sum_w + w(m_color(i,j) + 1);

xw = xw + w(m_color(i,j)+1)*[i-y(1),j-y(2)];

end

end

Y = xw/sum_w;

%中心点位置更新

rect(1) = rect(1) + Y(2);

rect(2) = rect(2) + Y(1);

end

%显示跟踪结果

v1=rect(1);

v2=rect(2);

v3=rect(3);

v4=rect(4);

figure(2);

clf;

imshow(Im);

hold on

rectangle('Position',[rect(1) rect(2) rect(3) rect(4)],'EdgeColor','r'); end

///////////////////////////////////

function w = weight(hist1,hist2)

w = zeros(1,4096);

for i = 1:4096

if hist2(i) ~= 0

w(i) = sqrt(hist1(i)/hist2(i));

else

w(i) = 0;

end

end

相关文档
最新文档