matlab 批处理,利用 matlab 做批处理

虽然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

你可能感兴趣的:(matlab,批处理)