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.结果:


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




116-121帧图像,红色框为跟踪框,蓝色框为groundtruth:

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
可以用来查看函数的用途,语法,用途。可以说 Matlab help 本身就是一本百科全书。很多内容都可以找到
第二章读取图像
  1. 图像的读取    
I=imread(‘pout.tif’);
imread 是读取图像的函数。 pout.tif matlab 内置的图像,不管在什么程序内都可以直接读取。那么,如果我们要读取其他位置的函数怎么做呢?这里我们来说几种常见的情形。
注: 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\25 20 个图像。
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 会改变原来图像的比例。 i mtool ,很少用到。那么用到的时候就再研究吧。一般用 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 。如图所示。




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

  3 、查看和分析结果:

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

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







第三章图像的存储

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 文件夹内。

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




猜你喜欢

转载自blog.csdn.net/lidawei0124/article/details/80917697
KCF
今日推荐