meanshift优缺点和算法代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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