在之前曾经试过把单个视频改为图片并且各自保存到单个的文件夹中,现在想要反其道而行之,把一堆图片转为视频。到PUDN上下了个靠谱的代码如下:
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 |
% function im2mov(picfrom,picend,picformat,aviname) %把图片集合成一段avi视频 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 施云涛 2009年01月08日 % 使用avifile、addframe、getframe等函数实现 % 输入: % picfrom起始位置 % picend终止位置 % picformat图片格式,以字符输入 % aviname生成avi的名字,必须带后缀名,以字符输入 %输出:当前目录下,名字为aviname的视频文件 %备注:所有图片的大小必须与第一次输入的大小一致 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% picfrom=1; picend=580; picformat='jpg'; aviname='e.avi'; %获得图片格式,picfrom表示从哪张图片开始,picend是图片帧数,picformat代表图片格式,aviname表示生成的avi的文件名 picname=strcat('C:\Users\lx\Desktop\脑洞\1out\*.',picformat); %写入相应的文件夹地址 %显示该目录下的该图片格式的所有图片,此处如使用ls,ls所得的结果是字符数组,对下一步无法更好操作 picname=dir(picname); picend=length(picname); %使用avifile,可进行很多参数的设定修改 aviobj = avifile(aviname); % aviobj = avifile('test.avi') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%可调整的参数 % Adjustable parameters: % Fps: 15.0000 % Compression: 'Indeo5' % Quality: 75 % KeyFramePerSec: 2.1429 % VideoName: 'test.avi' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%% %%自动获得的参数 % Automatically updated parameters: % Filename: 'test.avi' % TotalFrames: 0 % Width: 0 % Height: 0 % Length: 0 % ImageType: 'Unknown' % CurrentState: 'Open' %%%%%%%%%%%%%%%%%%%%%%% aviobj.Quality = 100; %设置质量为100 aviobj.Fps = 29; %设置帧数为29帧每秒 % aviobj.compression=''; %使用addframe把图片写入视频 for i=picend:-1:picfrom %picdata=imread(strcat('C:\Users\lx\Desktop\脑洞\1out\',picname(i,1).name)); picdata=imread(strcat('C:\Users\lx\Desktop\脑洞\1out\',[num2str(i),'.jpg'])); %以上是两种读文件的情况,如果所有的图片都是按照顺序排列的,文件名不规律,那么用第一种,如果你的每一帧取名为1,2,3……以此类推,那么因为按照第一种方式读文件会读1,10,101这样,所以应该用第二行的代码来读图片 aviobj=addframe(aviobj,uint8(picdata)); end aviobj=close(aviobj); |
相关注释里面都有,在这个过程中我遇到的一个问题就是采用代码第51行的语句读图像是,最后生成的avi视频顺序有问题,最后才发现,因为我的图片存储规则是1.jpg,2.jpg,3.jpg……但是它读文件的时候,读的是1.jpg,10.jpg,100.jpg这样,所以变成视频后不对,把它改成第52行的语句就可以了,当然如果你的视频帧命名方式不是这样,就还是采用第51行的语句。