虽然matlab很强大,但是在做数据批处理的时候完全用matlab的函数处理要么编程很麻烦或者执行效率太低,不如在循环里直接调用系统命令(cmd指令或是unix指令),编程菜鸟需要把步骤写在这里以便以后查询。
cmd和unix下有很多指令对操作系统文件是非常方便的,这些操作都可以在matlab中使用,而且c++生成的可执行文件也可以在matlab中使用。如果是在windows操作系统下,就是cmd窗口,这个窗口下输入的所有指令都可以使用matlab中的system函数或是unix函数实现。
步骤:
修改系统环境变量:如果是cmd指令,本身已经在系统路径中的此步骤调过,其他可执行文件,比如网上当的,假设放在
C:\***\bin\test.exe 下,对win7系统,计算机属性-高级系统设置-高级-环境变量-系统变量: 双击Path,编辑,在最后加上路径
C:\***\bin,跟前面的用分号隔开
matlab就可以直接调用了:实现是 system('test
eatg jewr')或uni(test
eatg jewr')。但如果cmd下输入的是cmd专属命令,就不可以用unix函数。同样,如果是在linux操作系统下,命令是输入在shell里的,和windows下的cmd窗口差不多,只是matlab中使用的是system函数和unix函数,但若是unix专属命令,只能用unix函数。
具体例子1:对批量修改文件名字,用系统命令 ren
文件夹中文件的原始名字为: person01_boxing_d1.avi ...
person20_walking_d4.avi
其中的文件分两部分改名,按照person**的标号,
要改成的新名字为:
actioncliptrain0001.avi,actioncliptrain0002.avi,....
actioncliptest0001.avi, actioncliptest0002.avi,....
matlab代码:
c1 = 'actioncliptrain';
c2 = 'actioncliptest';
trainperson_list = {'01','04', '11' '12' '13' '14' '15' '16' '17'
'18' '19' '20'};
testperson_list = {'02','03', '05', '06', '07',
'08', '09', '10'};
% action_list
= {'boxing', 'handclapping', 'handwaving', 'jogging', 'running',
'walking'};
count = 1;
for i= 1:length(trainperson_list)
z = dir(['D:\****\person',trainperson_list{i}, '*.avi']);
l = length(z);
for n = 1:l
b=num2str(count);c='0000';b=[c(1:4-length(b))
b]; newname = [c1, b, '.avi'];
system(['ren "D:\****\' z(n).name '" "' newname,
'"']); count = count+1;
end
end
count = 1;
for i= 1:length(testperson_list)
z = dir(['D:\****\person',testperson_list{i}, '*.avi']);
l = length(z);
for n = 1:l
b=num2str(count);c='0000';b=[c(1:4-length(b))
b]; newname = [c2, b, '.avi'];
system(['ren "D:\****\' z(n).name '" "' newname,
'"']); count = count+1;
end
end
具体例子2:对批量修改视频文件的尺寸(分辨率从),用外部函数ffmpeg(先把环境变量按上面步骤1添加好)
matlab代码:
% 把原视频的分辨率长宽各降低一半,放到另一个文件夹下,文件名不变
% 因为ffmpeg 修改视频尺寸的参数 -s mxn 貌似必须设定新的分辨率绝对值,没办法根据原尺寸降低对应比例
% 所以用了一个笨办法,用ffmpeg 从原视频读一帧图像保存,然后在matlab里获取图像尺寸,
% 然后长宽减低陈原尺寸的0.5,得到新尺寸
% 再调用一次ffmpeg 修改原视频的尺寸
s = 0.5;
video_path = 'D:/original/';
video_patha = [video_path, '*.avi'];
videodir = dir(video_patha);
for i = 1:length(videodir)
inputvideoname =[' "',video_path, videodir(i).name, '" '];
outputvideoname =[' "','D:/newfolder/', videodir(i).name,
'"'];
%获取一帧保存图像
a.jpg
command_frame = ['ffmpeg -y -i',inputvideoname, '-f image2 -t 0.001 "a.jpg"'];
[tmp,lenstring] = unix(command_frame);
%
计算新尺寸
[h,w,~] =
size(imread('a.jpg'));
w =
floor(w*s); h = floor(h*s);
command =
['ffmpeg -y -i', inputvideoname,' -s ', num2str(w),'*',num2str(h),
outputvideoname];
[tmp,lenstring] = unix(command);
end