找回密码
 注册
Simdroid-非首页
查看: 216|回复: 11

生成avi文件

[复制链接]
发表于 2011-5-31 23:51:29 | 显示全部楼层 |阅读模式 来自 江苏南京
一个m文件运行时候动态显示图片,怎样使得程序循环完毕后生成对应的avi文件
发表于 2011-6-1 10:16:12 | 显示全部楼层 来自 黑龙江哈尔滨
Simdroid开发平台
参考http://forum.simwe.com/thread-500384-1-1.html,不过不知道你为什么一定要生成avi文件
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-1 10:21:20 | 显示全部楼层 来自 江苏南京
2# messenger

多谢斑竹关注,我是想把程序运行过程中整个动态的变化过程做成avi文件以后再转变成jif格式动画图片,后一步我有专门软件,主要是前一步生成avi文件 的问题
回复 不支持

使用道具 举报

发表于 2011-6-1 10:26:15 | 显示全部楼层 来自 黑龙江哈尔滨
在Matlab中直接生成gif动画更方便,在avi中转一下,反倒效果不好,参考http://forum.simwe.com/thread-880377-1-1.html
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-25 11:40:28 | 显示全部楼层 来自 江苏南京
本帖最后由 scott198510 于 2011-6-25 11:44 编辑

4# messenger

看了看版主给的例子,貌似和我这个不一样,比如我有下面这个程序,怎样在程序里面加上几行代码,使得程序运算完成后,把总的循环图像保存为一个avi格式的文件呢,比如我的程序循环步数是110,我想每隔10步存一次动画,最后生成的avi文件一共是11帧,好像说有个movie2avi函数可以直接生成,但是还是不得要领,哪位用过动画的提示一下:


clc;clear;close all;
set(gcf,'DoubleBuffer','on');
N=256; % 设置状态矩阵线元胞总数
t1=4;t2=6;
S=zeros(N); % S是状态矩阵
S(fix(29*N/59):fix(30*N/59),fix(29*N/59):fix(30*N/59))=1;
sum(S(:))
Ii=imshow(1-S,[]);
axis square; % 设置坐标轴属性
Sm=zeros(N+2); % 生成一个比状态矩阵多2行和2列的矩阵
for k=1:110;
    Sm(2:end-1,2:end-1)=S; % 把Sm中间NxN的部分赋值为状态矩阵S
    M=Sm(1:end-2,2:end-1)+Sm(3:end,2:end-1)+Sm(2:end-1,1:end-2)+Sm(2:end-1,3:end); % 计算4近邻之和
    S=mod(M,2); % 用模除得到下一时刻状态矩阵的数值
    set(Ii,'CData',1-S); % 更新显示的数据
    pause(0.2); % 暂停一下显示出动画效果
end


回复 不支持

使用道具 举报

发表于 2011-6-25 20:51:06 | 显示全部楼层 来自 辽宁阜新
很好啊,我也有这个问题,大家一起研究啊
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-26 20:49:56 | 显示全部楼层 来自 江苏南京
6# Pmaster


呵呵 这麽淅沥的 问题还是自己搞定了:

clc;clear;close all;
set(gcf,'DoubleBuffer','on');
N=256; % 设置状态矩阵线元胞总数
t1=4;t2=6;
S=zeros(N); % S是状态矩阵
S(fix(29*N/59):fix(30*N/59),fix(29*N/59):fix(30*N/59))=1;
sum(S(:));
fh=figure;Ii=imshow(1-S,[]);
axis square; % 设置坐标轴属性
Sm=zeros(N+2); % 生成一个比状态矩阵多2行和2列的矩阵
ti=title('CAS=0', 'Fontsize',14,'Fontname','Times New Roman' );%显示标题
set(gcf,'Position',[232 258 560 420]);
set(gcf,'DoubleBuffer','on');
set(gcf,'color','w')
for k=1:110;
    Sm(2:end-1,2:end-1)=S; % 把Sm中间NxN的部分赋值为状态矩阵S
    M=Sm(1:end-2,2:end-1)+Sm(3:end,2:end-1)+Sm(2:end-1,1:end-2)+Sm(2:end-1,3:end); % 计算4近邻之和
    S=mod(M,2); % 用模除得到下一时刻状态矩阵的数值
    set(Ii,'CData',1-S); % 更新显示的数据
    set(ti,'string',['CAS=',num2str(k)]);  % 显示更新的CAS时间步数
    pause(0.2); % 暂停一下显示出动画效果
    Ma(k) = getframe(fh);
end
movie2avi(Ma,'dh.avi');

%%生成的动画avi文件 我转变为gif图片附上

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-6-26 22:20:05 | 显示全部楼层 来自 江苏无锡
这个挺有意思的,不过直接gif不行么?
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-26 23:37:56 | 显示全部楼层 来自 江苏南京
本帖最后由 scott198510 于 2011-6-27 20:12 编辑

8# JingheSu

直接 做成gif的我还没学会怎么用函数实现,而且上面这种movie2avi的做法对于循环次数太多时候貌似有问题,还要修改设置,还请斑竹现身大显神通改进改进上面部分
回复 不支持

使用道具 举报

发表于 2011-6-27 21:59:56 | 显示全部楼层 来自 英国
按照你5L的程序和要求改的,每隔10步存一次。

  1. clc;clear;close all;
  2. aviobj = avifile('11111111.avi','compression','None','fps',5);
  3. N=256; % 设置状态矩阵线元胞总数
  4. t1=4;t2=6;
  5. S=zeros(N); % S是状态矩阵
  6. S(fix(29*N/59):fix(30*N/59),fix(29*N/59):fix(30*N/59))=1;
  7. sum(S(:))
  8. Ii=imshow(1-S,[]);
  9. set(gcf,'DoubleBuffer','on');set(gcf,'color','w');set(gcf,'Position',[200 200 560 420]);
  10. ti=title('CAS=0', 'Fontsize',14,'Fontname','Times New Roman' );%显示标题
  11. axis square; % 设置坐标轴属性
  12. Sm=zeros(N+2); % 生成一个比状态矩阵多2行和2列的矩阵
  13. for k=1:110;
  14.     Sm(2:end-1,2:end-1)=S; % 把Sm中间NxN的部分赋值为状态矩阵S
  15.     M=Sm(1:end-2,2:end-1)+Sm(3:end,2:end-1)+Sm(2:end-1,1:end-2)+Sm(2:end-1,3:end); % 计算4近邻之和
  16.     S=mod(M,2); % 用模除得到下一时刻状态矩阵的数值
  17.     set(Ii,'CData',1-S); % 更新显示的数据
  18.     set(ti,'string',['CAS=',num2str(k)]);  % 显示更新的CAS时间步数
  19.     pause(0.02); % 暂停一下显示出动画效果
  20.     if rem(k,10)==0 %每10步存1帧
  21.         F=getframe(gcf,[0 0 560 420]);aviobj=addframe(aviobj,F);
  22.     end
  23. end
  24. aviobj=close(aviobj);
复制代码


我试过把K值改大,没发现什么问题啊。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-29 12:43:37 | 显示全部楼层 来自 江苏南京
本帖最后由 scott198510 于 2011-6-29 13:07 编辑
按照你5L的程序和要求改的,每隔10步存一次。

nwcwww 发表于 2011-6-27 21:59

楼组你这个搞法还是有问题,我的程序运行过程中每一步动态显示一次图片,只是最后制作的avi文件需要每10步保存一次,但是现在运行时候都是每10步才显示一幅图片,这背离了要求(上述这个程序没有,换个程序就是这样了,楼组可以换个程序试试),而且有个问题就是,楼组实现的是抓屏幕,把程序部分都会抓进动画里面,不相关的东西都抓进动画里面,该什么改改呢?还有就是如果直接用movie2avi函数的话,实现5#要求怎么改进呢?个人感觉还是movie2avi更好
回复 不支持

使用道具 举报

发表于 2011-6-29 22:08:58 | 显示全部楼层 来自 英国
楼组你这个搞法还是有问题,我的程序运行过程中每一步动态显示一次图片,只是最后制作的avi文件需要每10步保存一次,但是现在运行时候都是每10步才显示一幅图片,这背离了要求(上述这个程序没有,换个程序就是这样 ...
scott198510 发表于 2011-6-29 12:43


1。 我贴的代码确实是每一步显示一次图片的。rem(k,10)==0只影响到存入avi的命令,和画图无关。我不太理解你说的“换个程序试试”的意思,因为没见到你别的程序。
2。 如果需要换抓图的位置,改一下getframe的位置矩阵就行
3。 movie2avi本身其实就是call addframe来写入AVI啊。为什么这个函数对于本问题而言更好?非要用这个函数的话就按照你原来的做法再引入一个变量MA呗。
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-6 10:26 , Processed in 0.043034 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表