用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
操作的效果一样,所以就不再加入说明。
第一章:一些函数的介绍
- 介绍三个常用函数
clc;clear;closeall;
这三个函数不分家,在一个文件的开头经常会看到。那么他们的作用是什么呢?
clc
的作用就是清屏幕,即
Command Window
里的内容会被清除掉,但是他的值仍然存在软件里。
clear
是删除所有的变量。比如在前面定义了
A=5;
用
clear
函数之后,
A
就被清除了。后面想要用,就需要重新定义。
close all
是将所有打开的图片关掉。在函数的开头写上这样的函数,就保证不会受到之前变量等的影响。
当然,也可以单独使用。这样就能单独完成任务。这时最好在
Command Window
里操作。
- typefunction
Matlab
里面有很多内置的函数,当我们想查看函数内容的时候,就可以用
type function
来实现。比如想要查看
mean
函数,
Matlab
到底是怎么实现,直接
type mean
就可以看到。如果是查看别人的写的程序,在
mean
上点击右键,
open mean
就可以了。
- ver
查看当前
Matlab
版本的函数。一般用不到。
- docfunction /help function
可以用来查看函数的用途,语法,用途。可以说
Matlab
的
help
本身就是一本百科全书。很多内容都可以找到
第二章读取图像
- 图像的读取
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
)结合起来。利用相对路径来读取,这样当程序和图像同时放在其他电脑上时,不会因为路径而产生问题。
- 图像的显示
- imshow(I)
- imtool(I)
- 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
文件夹内。
这样就能够节省很多的人力。当文件比较多的情况下,人工去建立的话,还容易出错