matlab r2012a关于movie命令的问题 怎么解决matlab中使用了im2frame函数以后再用mo...

matlab \u7528movie\u505a\u52a8\u753b\u7684\u95ee\u9898\u3002

\u53bb\u6389plot\u8bed\u53e5\uff0c\u6216\u662f\u5728movie\u4e4b\u524d\u548cplot\u4e4b\u540e\u7684\u67d0\u5904\u5efa\u7acbfigure(2)\u8bd5\u8bd5\u3002

\u3010\u4f7f\u7528\u4e86im2frame\u51fd\u6570\u4ee5\u540e\u518d\u7528movie\u56fe\u50cf\u5c31\u4f1a\u5012\u50cf\u3011\u6ca1\u770b\u660e\u767d\u8fd9\u53e5\u8bdd\u4ec0\u4e48\u610f\u601d\u3002
\u8bf7\u63cf\u8ff0\u4e00\u4e0b\u9047\u5230\u7684\u5177\u4f53\u73b0\u8c61\uff0c\u4ee5\u53caMATLAB\u7248\u672c\u3002

网上有很多人用getframemovie实现动画的,有的还把动画写入GIF文件,但真正搞明白getframemovie用法的人好像并不多,大多数只是找来一段代码,稍加改动就用了,而对出现一些看起来有些奇怪的现象并未深究。

 

结合题主这个问题,我把相关的知识点稍微总结一下,供后来者参考。

 

1、首先应该搞明白getframe函数的用法。

很多人直接用getframe,还有人用getframe(1),但似乎都没有认真考虑,这样做得到的结果是什么。getframe的基本调用方式有以下几种:

F = getframe
F = getframe(h)
F = getframe(h,rect)

第2种调用是比较规范的做法,可以通过句柄h指定要捕获的帧是坐标系(axes)或是绘图窗口(figure),而第1种用法省略了参数h,则默认的为当前坐标系,也就是相当于getfram(gca)。至于第3种调用,可以指定捕获特定的矩形区域,不是很常用,这里就不说了。

 

题主的代码里用的是第1种调用方式,这种方式是对当前坐标系操作的。需要特别注意捕获的帧不包括坐标系的标题、坐标轴标识以及刻度标识(the contents of the current axes, exclusive of theaxis labels,title, ortick labels),换言之,也就是坐标系中由Color属性决定颜色(默认为白色)的那部分区域。对二维图而言,一般不会有太大问题;但对三维图而言,由于不同的视角会导致该部分区域大小发生变化,所以,getframe得到的不同帧的大小可能是不同的

 

题主得到上述奇怪结果的原因正在于此。由于循环过程中不断切换视角,三维图在屏幕上投影的区域也在变化,这样导致最终获取的数据各帧大小不一,而用movie播放时的基准是相对于左下对齐,所以就会看到【边旋转边左右平移的动画】。关于这一点,如果题主把axis vis3d off
最后的off去掉,能看的更清楚一些。

 

解决这个问题的做法是,捕捉帧的时候要对figure进行操作,也就是getframe(gcf),这样能保证捕捉的帧大小一致。上面说到,有人用getframe(1),很可能是没有搞明白这个参数“1”是什么意思,否则没理由句柄不用gcf而直接指定1,因为谁能保证运行程序时就没有别的绘图窗口存在?

 

但按照上面说的改了之后,又会出现新问题:用movie函数播放的时候发现动画整体上向右上偏移了一段距离。这就涉及到下一个话题——movie函数的使用。

 

2、关于movie函数的用法。这个看起来很简单,一般直接movie(m)就可以了,了解多一点的还知道可以指定播放次数n以及帧速fps

movie(M)
movie(M,n)
movie(M,n,fps)

但有一种用法通常会被忽略:

movie(h,...)

也就是,在前面的基本调用格式之前,增加了一个参数,可以指定播放是在绘图窗口或者坐标系中进行。如果省略了句柄h,则播放是在当前坐标系中进行的,这也就是刚才说到偏移的原因。

 

3、知道了上面两点,要想避免题主说到的问题,可采取的做法是:getframe捕获帧的时候针对figure进行,播放的时候也相对figure进行

 

参考代码:

[x y z]=peaks(50);
surfl(x,y,z);
axis([-10 10 -10 10 -10 10]);
axis vis3d off
axis equal
shading interp
colormap(copper)
clear m
for i=1:360
    view(-37.5+i,30);
    m(i)=getframe(gcf);
end
movie(gcf,m)

 

4、这一句:set(gcf,'renderer','zbuffer'),似乎并无必要。在多数环境下,三维图的默认renderopengl,偶尔会出现渲染问题,但也和题主所说的这种现象无关,遇到问题再改吧。



扩展阅读:matlab免费版 ... matlab2012a改中文 ... matlab2016a ... matlab免费下载安装教程 ... matlab r2012a汉化包 ... matlab2012a英文转中文 ... matlab2012a中文设置 ... matlab2012a咋汉化 ... matlab r2019b安装教程 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网