今天要对一个视频数据集进行处理,需要识别出一个视频每一帧图像中的人并且画框识别。最后人体识别的代码已经从网上找了,所以问题就是如何把数据集的所有视频转化为图片。
首先先看一下如何把单个视频转为图片:
1 2 3 4 5 6 7 8 9 10 |
%将视频变成图像保存 %videotoimg(mov) clear all; mov=mmreader('2538_11_70015.avi'); %读视频 for i=1:mov.numberofframes %循环每一帧把它变为图片,图片名为帧数.bmp b=read(mov,i); b=uint8(b); imwrite(b,strcat(int2str(i),'.bmp'),'bmp'); end |
mmreader函数可以读取视频地址,for语句循环每一帧图片并且转化为bmp格式。
现在假如有一个很大的数据集,应该如何读文件夹并且进行处理呢,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
<br />function demo() clear all; UpFilePath='E:\hollywood'; %最上层的地址 UpFileList=dir(UpFilePath); upff=1; for uprr=1:length(UpFileList) %得到顶层地址内部的文件夹名,存放在upfileFolder文件夹中,例如一个视频集文件有6个不同的类别,这一步就是得到这六个不同类比的名字 if(UpFileList(uprr).isdir==1&&~strcmp(UpFileList(uprr).name,'.')&&~strcmp(UpFileList(uprr).name,'..')) upfileFolder{upff}=[UpFileList(uprr).name]; upff=upff+1; end end for uprr=1:(upff-1) %轮询每一个类别的文件夹 FilePath=[UpFilePath,'\',upfileFolder{uprr}]; %确保输入正确的地址 FileList=dir(FilePath); %Filelist为单个类别的文件夹地址 ff=1; for rr=1:length(FileList) %得到单个类别的文件夹内部的视频文件名,存放在fileFolder中 if(FileList(rr).isdir==0&&~strcmp(FileList(rr).name,'.')&&~strcmp(FileList(rr).name,'..')) fileFolder{ff}=[FileList(rr).name]; ff=ff+1; end end for rr=1:(ff-1) %保存每一个视频文件的名字 answer=strfind(fileFolder{rr},'.avi'); fileFoldername{rr}=fileFolder{rr}(1:answer-1); end for rr=1:(ff-1) %为每个视频单独建一个同名文件夹,将单个文件夹中的所有视频变为图片,图片名按照帧数编号 new_folder=[FilePath,'\',fileFoldername{rr}]; mkdir(new_folder); movefile([FilePath,'\',fileFolder{rr}],[FilePath,'\',fileFoldername{rr}]); mov=mmreader([FilePath,'\',fileFoldername{rr},'\',fileFolder{rr}]); for i=1:mov.numberofframes b=read(mov,i); b=uint8(b); imwrite(b,[FilePath,'\',fileFoldername{rr},'\',strcat(int2str(i),'.bmp')],'bmp'); end end for rr=1:(ff-1) %为每一帧图片找框,生成csv文件并且存放在类别的文件夹下 addpath([FilePath,'\',fileFoldername{rr}]); img_dir = dir([FilePath,'\',fileFoldername{rr},'/*.bmp']); num = length(img_dir); output = zeros(num,5); for i=1:num output(i,:) = round(test(strcat(int2str(i),'.bmp'), 'person')); %save 1.txt -ascii output end output(:,5)=[]; csvwrite([FilePath,'/',fileFoldername{rr},'.csv'],output); end end end %save 1.txt -ascii output |
具体的注释在代码中已经有说明,这里把思路再简要说明如下:
假设在E盘放了一个文件夹名为hollywood的视频集,文件夹中有六个子文件夹,名字是动作名称类别等,例如run,walk,drive,kiss,bike,golf,在每个文件夹中是相应的视频,这个程序最外层的循环得到六个类别的文件夹名,然后得到每个二级文件夹中视频的名字以生成地址,再对每一个视频新建一个文件夹,分解开的每一帧图片放入相应的文件夹中,命名规则为1.bmp,2.bmp等,以此类推,最后进行相应的处理,例如机器学期或者人体识别等等,下面这部分的代码直接复制应该并不能使用,因为人物识别的代码我并没有贴,不过大家可以根据这个思路进行大多数数据集的处理.