实现:
% 从data目录中复制指定类型的文件到目录copydata中然后再剪切到movedata中,再找到符合某个条件的文件并删除
data='K:\test\1';
copydata='K:\test\2';
movedata='K:\test\3';
subDir=dir(data);
len = length(subDir);
disp('begin copy files..');
for i=3:len
imgNames = dir(strcat(data,'\',subDir(i).name));
a=[copydata,'\',subDir(i).name];
%先将文件a复制到文件夹2里面,然后再将文件夹2中的文件a再剪切到文件夹3
copyfile([data,'\',subDir(i).name],a);
movefile(a,[movedata,'\',subDir(i).name]);
end
disp('end');
files=dir(movedata);
filenum=length(files);
for curfile=3:filenum
a=strfind(files(curfile).name,'-');%寻找文件名有'-'符号的文件进行删除
if(~isempty(a))
delete([movedata,'\',files(curfile).name]);
end
end
一个修改文件名的代码(为符合caffe的识别):
clear;close all;clc;
%文件命名规则:col+'_'+视频序号+'-'+数据位置+'-'+分割位置标记+'-'+帧号(符合caffe的识别)
%%
%程序设计上考虑数据保存的实际情况,数据根据各个类别放在不同的文件夹里面。
%所以程序设计上,就是读取路径文件夹下面的所有子文件夹的数据,然后改名
%每次运行程序,需要修改的变量如下
changeVedio='178';
fgwzbj='zz';
dirPath='L:\seg\分类';%数据路径
%%
%读取文件夹列表,但这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个)。所以真正的数据文件夹从第3个开始
dirList=dir(dirPath);
countList=length(dirList);%文件夹个数
for numList=3:countList%文件夹从3开始,目录中.和..在第一和第二,应该是某种规则
%根据这个过滤掉在此文件夹可能存在的txt文件
%由于这里面保存数据的文件夹都是0,1,2,3..所有用了下面的判断
if(length(dirList(numList).name)>=3)
continue;
end
fileNameList=dir([dirPath,'\',dirList(numList).name]);%读取子文件夹中的图片
fileSum=length(fileNameList);%统计子文件夹中的文件个数
for fileNum=3:fileSum%文件从3开始
%由于对于不同的视频改写的文件名不同,所以要先进行判断,到底是不是要改的文件
%原始图像的文件名为类似于178 4_000001.jpg形式的
%
[spxh,~]=strtok(fileNameList(fileNum).name);%由于前一个程序设定的命名规则,所以由默认的空格符号分割文件名,得到前面的视频序号
%用函数strcmpi判断两个字符串是否相等,函数strcmpi相等输出1,否则输出0
%如果不相等,即不是要处理的数据,进入下一个循环
if strcmpi(spxh,changeVedio)==0
continue;
end
realName=[dirPath,'\',dirList(numList).name,'\',fileNameList(fileNum).name];%依次得到具体图片文件的完整路径
%前178 4_000001.jpg。文件命名规则:视频序号+空格+数据位置+'_'+视频帧号。
%后col_185-4-zz-_000413.jpg。文件命名规则:col+'_'+视频序号+'-'+数据位置+'-'+分割位置标记+'-'+帧号
%想改成的文件名。
sjwz=fileNameList(fileNum).name(5);
zh=fileNameList(fileNum).name(6:end);
changeName=[dirPath,'\',dirList(numList).name,'\','col','_',spxh,'-',sjwz,'-',fgwzbj,'-',zh];%修改后具体图片文件的完整路径
%%%主要就是下面这句更改文件名
movefile(realName,changeName);
end
end
%%
下面是一段生成label的代码:
clear all;clc;
% 写train的label
path='L:\seg\分类\11\train';
filedir=dir(path);%读取目录
countdir=length(filedir);
fid = fopen([path,'\','train.txt'], 'w');%打开文本文件
for numdir=3:countdir
file=dir([path,'\',filedir(numdir).name])%读取文件
countfile=length(file);
for numfile=3:countfile
fprintf(fid,'%s', [filedir(numdir).name,'/',file(numfile).name]);
fprintf(fid,'%s', ' ');%要注意这单独就是用一个空格分隔
fprintf(fid,'%d', str2num(file(numfile).name(1)));%加入label,注意这里加入了一个字符串转换
fprintf(fid,'\n');%换行
end
end
fclose(fid);%关闭文本文件
fclose('all');
文件夹val下面的文件夹里面的图片依次resize固定尺寸到固定目录:
%在同样的文件夹结构、同样的位置
%把指定文件夹以同样的图片类型都转化为32*32的图片
clear;close all;clc;
pathRead='L:\seg\分类\11\val';
pathSave='L:\seg\分类\11\val\guiyi';
dirList=dir(pathRead);%读取文件夹列表,这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个)
countList=length(dirList);%文件夹个数
for numList=3:countList%文件夹从3开始
%根据这个过滤掉在此文件夹可能的train.txt文件
%由于这里面保存数据的文件夹都是0,1,2,3..所有用了下面的判断
if(length(dirList(numList).name)>=2)
continue;
end
fileName=dir([pathRead,'\',dirList(numList).name]);%读取子文件夹中的图片
fileSum=length(fileName);%统计子文件夹中的文件个数
%在存储路径,创建对应的文件夹
pathCreDir=[pathSave,'\',dirList(numList).name,'\'];
mkdir(pathCreDir);
for fileNum=3:fileSum%文件从3开始
tempName=[pathRead,'\',dirList(numList).name,'\',fileName(fileNum).name];%依次得到具体图片文件的完整路径
temp=imread(tempName);%读入图片
normtemp=imresize(temp,[32 32]);%归一化图片,尺寸全部改为32*32
%保存在和源文件一样的对应文件夹内,按同样的文件名、文件类型保存
imwrite(normtemp,[pathCreDir,fileName(fileNum).name]);
end
end