今天做目标跟踪,由于是对图像序列中目标做跟踪,在跟踪了以后想要将跟踪的效果做成视频。问了度娘看了前辈们的一些做法,大多零散。在此将参考前辈们的方法而写的一个将目标跟踪中效果保存成视频的matlab小程序分享给大家,希望能有所帮助。
分为两个步骤:
一:将目标在对应的图像中画出(以矩形框为例)代码如下:
1 function result=draw_rect(data,pointAll,windSize) 2 % 函数调用:result=draw_rect(data,pointAll,windSize) 3 % 函数功能:在图像画个长方形框 4 % 函数输入:data为原始的大图,可为灰度图,可为彩色图 5 % pointAll 框的左上角在大图中的坐标(每行代表一个坐标), 6 % 注意:在图中的坐标系为第一列为y,第二列为x(很奇怪的) 7 % windSize 框的大小 windSize=[112,92] 分别表示长宽 8 % showOrNot 是否要显示,默认为显示出来 9 % 函数输出:
result - 结果图像数据 13 if nargin < 4 14 showOrNot = 1; 15 end 16 17 rgb = [255 0 0]; % 边框颜色 18 lineSize = 3; % 边框大小,取1,2,3 19 20 windSize(1,1)=windSize(1,1); 21 windSize(1,2) = windSize(1,2); 22 if windSize(1,1) > size(data,1) ||... 23 windSize(1,2) > size(data,2) 24 state = -1; % 说明窗口太大,图像太小,没必要获取 25 disp('the window size is larger then image...'); 26 return; 27 end 28 size(data,1) 29 result = data; 30 if size(data,3) == 3 31 for k=1:3 32 for i=1:size(pointAll,1) %画边框顺序为:上右下左的原则 33 result(pointAll(i,1),pointAll(i,2):pointAll(i,2)+windSize(i,1),k) = rgb(1,k); 34 result(pointAll(i,1):pointAll(i,1)+windSize(i,2),pointAll(i,2)+windSize(i,1),k) = rgb(1,k); 35 result(pointAll(i,1)+windSize(i,2),pointAll(i,2):pointAll(i,2)+windSize(i,1),k) = rgb(1,k); 36 result(pointAll(i,1):pointAll(i,1)+windSize(i,2),pointAll(i,2),k) = rgb(1,k); 37 if lineSize == 2 || lineSize == 3 38 result(pointAll(i,1)+1,pointAll(i,2):pointAll(i,2)+windSize(i,1),k) = rgb(1,k); 39 result(pointAll(i,1):pointAll(i,1)+windSize(i,2),pointAll(i,2)+windSize(i,1)-1,k) = rgb(1,k); 40 result(pointAll(i,1)+windSize(i,2)-1,pointAll(i,2):pointAll(i,2)+windSize(i,1),k) = rgb(1,k); 41 result(pointAll(i,1):pointAll(i,1)+windSize(i,2),pointAll(i,2)-1,k) = rgb(1,k); 42 if lineSize == 3 43 result(pointAll(i,1)-1,pointAll(i,2):pointAll(i,2)+windSize(i,1),k) = rgb(1,k); 44 result(pointAll(i,1):pointAll(i,1)+windSize(i,2),pointAll(i,2)+windSize(i,1)+1,k) = rgb(1,k); 45 result(pointAll(i,1)+windSize(i,2)+1,pointAll(i,2):pointAll(i,2)+windSize(i,1),k) = rgb(1,k); 46 result(pointAll(i,1):pointAll(i,1)+windSize(i,2),pointAll(i,2)+1,k) = rgb(1,k); 47 end 48 end 49 end 50 end 51 end
二:将图像存入视
clc ;clear all;close all; addpath('./cliffbar');%添加图像所在路径,即测试所用图像序列路径 img_dir = dir('./cliffbar/*.png'); len=length(img_dir); aviobj = avifile('cliffbar.avi');%创建一个名为cliffbar的视频,即生成视频的名字 aviobj.Quality = 100;%内调参数,详细了解可以使用help查看 start_point=[120,138];%所画矩形的起始点 h_w=[38,59];%所画矩形的长宽 for i=1:len img=imread(img_dir(i).name); result=draw_rect(img,start_point,h_w); aviobj=addframe(aviobj,uint8(result)); end aviobj=close(aviobj);