matlab对kcf跟踪结果的分析

用matlab对kcf跟踪结果的分析
1.MATLAB代码:

A:读取跟踪过程中各种置信度,apce psr peakvalue 并分析 其对判别跟踪失败检测的效果
clear all;clc;
target='Woman';%%CarScale, Woman
text=importdata(['trackerlog_',target,'.txt']);
frame=text(:,1);
fps=text(:,2);
apce=text(:,3);
psr=text(:,4);
peakvalue=text(:,5);
roi=text(:,6:9);
%%pos=text(:,5:6);
flag=text(:,10:13);
groundtruth=importdata([target,'/groundtruth_rect.txt']);

n=size(peakvalue,1);
for i=1:1:n
if i<6
meanpeakvalue(i)=peakvalue(i);
meanapce(i)=apce(i);
meanpsr(i)=psr(i);
else
meanpeakvalue(i)=0.70*(peakvalue(i-5)+peakvalue(i-4)+peakvalue(i-3)+peakvalue(i-2)+peakvalue(i-1))/5;
meanapce(i)=0.40*(apce(i-5)+apce(i-4)+apce(i-3)+apce(i-2)+apce(i-1))/5;
meanpsr(i)=0.40*(psr(i-5)+psr(i-4)+psr(i-3)+psr(i-2)+psr(i-1))/5;
end
if(flag(i,4)==3)
fail_flag(i)=1;
else fail_flag(i)=0;
end
end
meanpeakvalue = meanpeakvalue(:);
meanapce = meanapce(:);
figure('Name','result')
subplot(2,3,1);
plot(frame,fps);
title('fps')
subplot(2,3,2);
plot(frame,peakvalue);
hold on
plot(frame,meanpeakvalue);
plot(frame,fail_flag);
title('peak')
subplot(2,3,4);
plot(frame,apce);
hold on
plot(frame,meanapce);
plot(frame,fail_flag*100);
title('apce')
subplot(2,3,5);
plot(frame,psr);
hold on
plot(frame,meanpsr);
plot(frame,fail_flag*500000);
title('psr')
subplot(2,3,[3 6]);
precision_plot(roi,groundtruth);


B:读取跟踪结果输出,根据跟踪的roi(跟踪的框)以及groundtruth绘制跟踪效果对比图并保存
figure('Name','tracking Boxs')
for i=1:n
I=imread([target,'\img\',num2str(i),'.jpg']);%%change dataset folder
imshow(I);%%show frame
hold on;
axis off;
%%change folder of datasets
%%waitkey(1);
rectangle('Position',groundtruth(i,:),'Curvature',[0 0],'EdgeColor','b','LineWidth',2);%%plot groundtruth
rectangle('Position',roi(i,:),'Curvature',[0 0],'EdgeColor','r','LineWidth',2);%%plot roi of tracking
saveas(gca,[target,'\result\',num2str(i),'.jpg']);%%change dataset folder
%%pause(0.000001);
%%groundtruth_x(i),groundtruth_y(i),groundtruth_w(i),groundtruth_h(i)wen
end

C:显示跟踪结果效果图
i=1;
figure('Name',['tracking Boxs of ',target])
while(1)
I=imread([target,'\result\',num2str(i),'.jpg']);%%change dataset folder
imshow(I);
hold on;
axis off;
pause(0.01);
i=i+1;
end
精度计算函数
function precisions = precision_plot(positions, ground_truth)
%PRECISION_PLOT
% Calculates precision for a series of distance thresholds (percentage of
% frames where the distance to the ground truth is within the threshold).
% Accepts positions and ground truth as Nx2 matrices (for N frames), and
% a title string.

max_threshold = 50; %used for graphs in the paper
precisions = zeros(max_threshold, 1);
if size(positions,1) ~= size(ground_truth,1),
% fprintf('%12s - Number of ground truth frames does not match number of tracked frames.\n', title)
%just ignore any extra frames, in either results or ground truth
n = min(size(positions,1), size(ground_truth,1));
positions(n+1:end,:) = [];
ground_truth(n+1:end,:) = [];
end
%calculate distances to ground truth over all frames
distances = sqrt((positions(:,1) - ground_truth(:,1)).^2 + ...
(positions(:,2) - ground_truth(:,2)).^2);
distances(isnan(distances)) = [];
%compute precisions
for p = 1:max_threshold,
precisions(p) = nnz(distances <= p) / numel(distances);
end
%plot the precisions
%%figure('Name',['Precisions of ',title])
plot(precisions, 'k-', 'LineWidth',2)
xlabel('Threshold'), ylabel('Precision')
title('Precisions')
end
2.结果:
matlab对kcf跟踪结果的分析


分析了跟踪过程中的运行帧数fps变化,以及peakvalue/apce/psr的变化(蓝色线),以及对应的平均值注:乘上一个惩罚因子:meanpeakvalue:0.7/meanapce:0.4/meanpsr:0.4(红色线),用来做判别,还有跟踪失败的标志位:fail_flag,途中所示为frame121时出现一次跟踪失败(黄色线)。
最后还有计算跟踪准确度的分析图。
matlab对kcf跟踪结果的分析

matlab对kcf跟踪结果的分析

116-121帧图像,红色框为跟踪框,蓝色框为groundtruth:
matlab对kcf跟踪结果的分析
3.干货:
matlab rectangle画矩形函数:
rectangle('Position',[x,y,w,h])
从点(x,y)开始绘制一个宽w高h的矩形,对坐标轴数据单元指定值。
注意,按指定的比例显示矩形,需要设置坐标轴数据宽高比来使得x和y轴有等长的单位。你可以用命令axis equal 或者daspect([1,1,1])。

rectangle绘制一个矩形,其默认位置是[0,0,1,1] ,默认曲率是 [0,0](也就是说,没有曲率)。

rectangle(...,'Curvature',[x,y])指定矩阵边的曲率,可以使它从矩形到椭圆不同变化,水平曲率x为矩形宽度的分数,是沿着矩形的顶部和底部的边进行弯曲。竖直曲率y为矩形高度的分数,是沿着矩形的左面和右面的边进行弯曲。x和y取值范围是从0(无曲率)到1(最大曲率)。值[0,0]绘制一个成直角的矩形,值[x,y]绘制一个椭圆。如果仅仅指定曲率的一个值,那么在水平曲率和竖直曲率都有相同的值。

h = rectangle(...)返回创建矩形对象的句柄。
备注:矩形对象是2维的,仅仅能在[0 90](i.e., view(2))范围内被绘制,矩形对象是坐标的子对象,被定义在坐标轴数据内。
例:rectangle('position',[1,1,5,5],'edgecolor','b');
还可以设置其他参数
'position',[1,1,5,5]表示从(1,1)点开始高为5,宽为5;
'curvature',[1,1]表示x,y方向上的曲率都为1,即是圆弧;
'edgecolor','r'表示边框颜色是红色;
'facecolor','g'表示面内填充颜色为绿色。
注意在使用时需要注意先将图片显示出来,然后再对图像中你所需要的区域标记。
MATLAB 图像处理,等函数 包括imread,批量读取图像:
图像处理,主要是对已有的图像进行处理,然后再存储起来,并不是无中生有,创造出一幅图像。因此,图像的读取和存储显得比较重要。
    这里创建test.m文件放入已经创建的Matlab文件夹里,之后的操作都在这里进行。由于在文件中操作和Command Window操作的效果一样,所以就不再加入说明。
第一章:一些函数的介绍
  1. 介绍三个常用函数
clc;clear;closeall;
这三个函数不分家,在一个文件的开头经常会看到。那么他们的作用是什么呢?clc的作用就是清屏幕,即Command Window里的内容会被清除掉,但是他的值仍然存在软件里。 clear是删除所有的变量。比如在前面定义了 A=5;clear函数之后,A就被清除了。后面想要用,就需要重新定义。close all是将所有打开的图片关掉。在函数的开头写上这样的函数,就保证不会受到之前变量等的影响。
当然,也可以单独使用。这样就能单独完成任务。这时最好在Command Window里操作。
  1. typefunction
Matlab 里面有很多内置的函数,当我们想查看函数内容的时候,就可以用type function来实现。比如想要查看mean函数,Matlab到底是怎么实现,直接type mean就可以看到。如果是查看别人的写的程序,在mean上点击右键,open mean就可以了。
  1. ver
查看当前Matlab版本的函数。一般用不到。
  1. docfunction /help function
可以用来查看函数的用途,语法,用途。可以说Matlabhelp本身就是一本百科全书。很多内容都可以找到
第二章读取图像
  1. 图像的读取    
I=imread(‘pout.tif’);
imread是读取图像的函数。pout.tifmatlab内置的图像,不管在什么程序内都可以直接读取。那么,如果我们要读取其他位置的函数怎么做呢?这里我们来说几种常见的情形。
注:Matlab文件夹内有test.m,1.jpg,image文件夹,同时image文件夹内有2.jpg
(1)读取1.jpg
I=imread(‘1.jpg’);
(2)读取2.jpg
I=imread(‘image\2.jpg’);%相对路径的读取
(3)读取D:\1023\25\1.jpg
I=imread(‘D:\1023\25\1.jpg’);%绝对路径的读取
(4)读取D:\1023\2520个图像。
for i=1:20
 I=imread([‘D:\1023\25\’,num2str(i),’.jpg’]);
end
注:第四种情况需要注意的是,里面添加了[ ],来保证这是一个整句。num2str(i)是将i由数字转换成字符形式。这样就能实现循环读取。一般来说,会将图像跟.m文件放在一起。当图像较多时,图像放入image文档中,读取方式将(2)和(4)结合起来。利用相对路径来读取,这样当程序和图像同时放在其他电脑上时,不会因为路径而产生问题。
  1. 图像的显示
  1. imshow(I)
  2. imtool(I)
  3. image(I)
关于这三个函数用法的区别,就在上面这个文章内。主要的意思是:imshow显示按照原来的比例,而image会改变原来图像的比例。imtool,很少用到。那么用到的时候就再研究吧。一般用imshow就足够了。
那么什么时候用figure呢?当程序中只显示一幅图像时,直接imshow就可以。然后当图像多的时候,就需要用到figuure;imshow(I1);figure;imshow(I2);figure;imshow(I3)
如果想要在一张图片内,显示好几个图怎么办呢?title显示在图像的上方,起到提示的作用。
I=imread('pout.tif');
subplot(221);imshow(I);title('1');
subplot(222);imshow(I);title('2');
subplot(223);imshow(I);title('3');
subplot(224);imshow(I);title('4');
其中前面的22代表是2*2的分布,也可以是2*3,3*4等。按照行来排列,从第一行开始分别为1 2 3 4。如图所示。
matlab对kcf跟踪结果的分析



这里还值得一提的是figure;如果没有要求的话,直接用figure。此时希望图2来显示某个图像,那么figure(2),就指定来显示某个图像。当然了,如果仅有一个图像显示这样做,那么可能会被覆盖掉,因此,一个程序中的用法一定要统一,并且保证后面的,不要把前面的覆盖掉。

  3、查看和分析结果:

 workspace中会有I 291*240 uint8  74 224 ,就这说明了I是二维图像,大小是291*240,uint8型的。最小值为74,最大值是224.这里指的是灰度值。

 用函数whos就能显示I的相关信息:

matlab对kcf跟踪结果的分析





第三章图像的存储

1、图像的存储

imwrite(I,’pout1.jpg’);

同样,imwrite也有相对路径和绝对路径的存储,以及连续的存储方法。同imread

imwrite(I,’pout1.jpg’);

imwrite(I,’image\pout1.jpg’);

imwrite(I,’D:\Matlab\image\pout1.jpg’);

imwrite(I,[’image\’,num2str(i),’.jpg’])%i是变量,需要定义

这里的.jpg可以改成.bmp等,想要的格式。

需要注明的是,存储所选择的文件夹,需要已经建立好。那么怎么去自动建立文件夹呢?

需要用mkdir函数。

mkdir(‘D:\image\1’)%绝对路径的建立。

mkdir(‘image\1’);%绝对路径文件夹的建立。创建之后,在Matlab文件夹内。

这样就能够节省很多的人力。当文件比较多的情况下,人工去建立的话,还容易出错