其实这个Matlab修改文件名,就是要熟悉一个函数movefile,这个函数貌似有两个功能1、移动一个文件到另外的地方(实验显示,具体实现的功能应该是把源地址的数据根据修改后的文件名保存到目的路径,源地址的数据被删除)2、就是在同一个文件夹下面对于文件进行改名。
下面这个程序,现在是指定文件夹后,只能指定一个视频的一种分割位置更改。还可以考虑的优化,是指定多个视频,多个分割位置信息信息更改。不过貌似这样改运算量会大很多。以后再说吧
clear;close all;clc;
%由于数据采集阶段编写了两个matlab代码一起操作,来处理数据。
%前一个Matlab程序是用来从视频中截取数据的。后一个是用来挑选数据的类别。
%前后两个程序的命名规则是不同的。
%前178 4_000001.jpg。文件命名规则:视频序号+空格+数据位置+'_'+视频帧号。
%而有这个空格号,当初也是考虑到strtok函数更好分割文件名。但caffe中不能识别有空格号的文件名。所以必须改
%后col_185-4-zz-_000413.jpg。文件命名规则:col+'_'+视频序号+'-'+数据位置+'-'+分割位置标记+'-'+帧号
%现在感觉这挑选后的文件名,这里面'_'和'-'太多了,虽然这当初考虑是为了方便看各个数据,而且caffe不能识别有空格的label
%所以才加了那么多。但最后的_000413,就是把原文件名拆掉然后来看,这里面连着'-'和'_',确实是有点不好看。
%至于以后怎么考虑更好的命名规则,以后再说了。现在的任务就是把文件夹中的前面这种命名规则挑选出来,并改为后面这种命名规则的文件名
%%
%程序设计上考虑数据保存的实际情况,数据根据各个类别放在不同的文件夹里面。
%所以程序设计上,就是读取路径文件夹下面的所有子文件夹的数据,然后改名
%每次运行程序,需要修改的变量如下
changeVedio='178';
fgwzbj='zz';
dirPath='C:\Users\Dy\Desktop\彩色视频真实数据\sj3';%数据路径
%%
%读取文件夹列表,但这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个)。所以真正的数据文件夹从第3个开始
dirList=dir(dirPath);
countList=length(dirList);%文件夹个数
for numList=3:countList%文件夹从3开始,目录中.和..在第一和第二,应该是某种规则
%根据这个过滤掉在此文件夹可能存在的txt文件
%由于这里面保存数据的文件夹都是0,1,2,3..所有用了下面的判断
if(length(dirList(numList).name)>=2)
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
%%
%下面这代码是,原来得到的是RGB图像,最开始考虑,可以生成一些灰度图像来作为训练集去测试。看看效果怎么样(其实现在发现这没用,不合理)。但当时考虑如果生成了灰度图像,最好能在彩色图像前面加上col前缀,因为有些图片灰色的,看不出是彩色还是灰度。作为一个例子来看还是可以的。
clear;close all;clc;
%这个程序是写的为了原来的文件名就是单独的数字,但是后来考虑,可能会加入灰度图像
%所以在彩色图像文件名前面加上col,及col+文件名 来作为新的文件名
%继续添加路径
pathRead='C:\Users\Dy\Desktop\归一化后的图像\train9';
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);%统计子文件夹中的文件个数
for fileNum=3:fileSum%文件从3开始
realName=[pathRead,'\',dirList(numList).name,'\',fileName(fileNum).name];%依次得到具体图片文件的完整路径
%%%主要就是下面这句更改文件名
changeName=[pathRead,'\',dirList(numList).name,'\','col',fileName(fileNum).name];%修改后具体图片文件的完整路径
movefile(realName,changeName);
end
end
下面为最开始写的,带吐槽。但毕竟花了时间写,就不删掉了。
哎 用caffe的imagenet生成数据,擦,貌似不能识别中文,原来生成的一堆中文文件名的图像要改一堆名字去测试一下效果,哎,手动改太麻烦,用matlab试试,从网上找了个代码。
原始的代码如下
clear;clc;
str = dir('e:\laowu2013-07-23\matlab code\My Programs\tests\RayleighWave_Viscoelastic\muller\*.bin'); % 替换成你自己的文件所在目录
strx = struct2cell(str);
sn = length(strx(1,:));
for ix = 1:sn
newname=sprintf('ss-%d.bin',ix);
movefile(strx{1,ix},newname);
end
50个金币呀,居然还是13年的。。不过看看问问题的是搞催化化学的,回答问题的是应用地球物理学的,额。。。
原文件名为类似于以下这种
方正姚体3常规0Black1.jpg 被下面程序改为类似于 0BitBlack1.jpg这种形式
个人改了改如下
clear;clc
%原来生成的数据名字都是中文的,哎,没想到整到用imagenet的create来生成数据
%然后用cifar10来处理这一步,所以要把中文名字现在全部改为英文
file=dir('C:\Users\Dy\Desktop\实验数据\train\one\*.jpg');%读取文件名列表
filecell=struct2cell(file);%把数据类型由str换为cell,不知道为啥要更换数据类型,更换后变成一个cell数组了,第一行就是文件名
count=length(filecell(1,:));%取这个cell数组的第一行,就是这个文件名的这一行,然后列出长度,感觉闲的蛋疼,直接用length(file)直接就能出个数,还要整的那么麻烦
for num=1:count%就是循环改名,没啥。
newname=sprintf(file(num).name(8:end));%貌似这个sprintf没啥用。其实这个sprintf就是转换为字符串形式,这个直接取出的数据,感觉就是字符串形式
movefile(filecell{1,num},newname);%这句就是该文件名,感觉应该就是这句,这个文件必须在处理的数据的那个文件夹下面运行
end% 感觉上面的代码太挫了,再改
file=dir('C:\Users\Dy\Desktop\实验数据\train\zero\*.jpg');
count=length(file);
for num=1:count
newname=file(num).name(8:end);
movefile(file(num).name,newname);%主要就是这个命令,要把m文件考到那个文件夹下面去,感觉如果继续修改,要怎么添路径
end
1 path='C:\Users\Dy\Desktop\实验数据\val';
2 file=dir(path);%这种方式读取好像会保留原文件.(在结构体中第一个)和上一次目录..(在结构体第二个),所以从第3个开始
3 count=length(file);
4 for num=3:count
5 newname=file(num).name(8:end);
6 movefile([path,'\',file(num).name],[path,'\',newname]);
7 end
好像运行这个代码的时候,在命令窗口运行下指令时会出错。而运行程序时没问题,不知道什么原因,就像最开始找到的程序,没搞懂为啥movefile函数里面为啥用cell,应该就是movefile函数没搞懂