【发布时间】:2013-04-11 14:12:09
【问题描述】:
我目前正在尝试使用 MATLAB 中的 writeVideo 函数制作视频。我使用 GUIDE 制作了一个 GUI,其中包括一个滑块、几个复选框和一个轴(标记为 axes1)。当我移动滑块时,轴将绘制某些形状,这些形状会根据滑块值发生变化。
我想要做的是录制用于在演示文稿中显示功能的 GUI 的视频。但是,当我播放视频时(使用 writeVideo 制作后),它显示滑块值移动并且复选框被正确选中,但绘图永远不会改变(即它只会显示原始形状)。这似乎是一些刷新错误,但是,我尝试过的任何事情都没有奏效(刷新、绘制等)
知道为什么会这样吗?以下是我正在尝试实现的代码:
vidObj = VideoWriter('test.avi','Motion JPEG AVI');
open(vidObj);
flag = 0;
if flag<12 %movie will be 12 frames long
flag = flag+1;
if slider<1
plot something...
elseif slider>=1 && slider<2
plot something else...
etc...
elseif slider<=5
plot something else...
end
hFigure = findobj('Name','gui');
currFrame = getframe(hFigure);
writeVideo(vidObj,currFrame);
clear hfigure currFrame image;
else
fprintf('done\n')
close(vidObj);
end
如上所述,然后我可以使用 implay 播放 test.avi 文件,但是,情节永远不会更新。
提前致谢
注意:我使用的是 MATLAB R2012b
编辑:
以下是我最终创建视频的方式:也许这会对面临与上述类似问题的人有所帮助。
我基本上放弃了使用 getframe 并决定 1) 获取屏幕截图,然后 2) 将屏幕截图变成电影。为了获取屏幕截图,我首先运行我的程序,然后在命令窗口中,使用 java 工具包调用以下代码
i = 1;
while true
robo = java.awt.Robot;
t = java.awt.Toolkit.getDefaultToolkit();
%# Set screen size
rectangle = java.awt.Rectangle(0,0,1000,640);
%# Get the capture
image = robo.createScreenCapture(rectangle);
%# Save it to file
filehandle = java.io.File(sprintf('capture%d.jpg', i));
javax.imageio.ImageIO.write(image,'jpg',filehandle);
pause(.4) %# Wait for 0.4 seconds
i = i + 1;
end
然后它会在后台持续运行并拍摄屏幕快照并将它们存储到当前目录中。要阻止它运行,只需使用 Ctrl C 即可。获得屏幕截图后,我使用以下代码创建电影:
vidObj = VideoWriter('test.avi','Motion JPEG AVI');
open(vidObj);
for i=7:87 %these are the frames I wanted in my movie
x = num2str(i);
im = horzcat('capture',x);
im1 = horzcat(im,'.jpg')
imdata = imread(im1);
writeVideo(vidObj,imdata);
end
close(vidObj);
【问题讨论】:
-
您是否在每次迭代时尝试
pause一段时间? -
为什么每次都要
clear?你的图像变量是什么?注意有一个内置的 MATLABimage函数。 -
您好,谢谢您的意见。不幸的是,我尝试了drawow和pause(最多5秒)但没有奏效。更具体地说,GUI 按预期工作,但无论出于何种原因,当我使用 getframe 时,它总是显示初始化图而不是“新”图。在代码中,我告诉它获取整个 GUI(巧妙地命名为 gui),而不仅仅是轴/绘图。我不确定它为什么这样做,因为我已经在每次迭代后清除变量以尝试获取“新”getframe。
-
我不知道 writeVideo 命令是否存在导致此绘图更新错误的内部问题,或者我只是忽略了某些东西
-
我尝试使用 clear 来确保我的变量 currFrame 实际上正在获取更新的帧,而不是简单地显示初始化的帧。另外,我知道图像是一个函数。请忽略上述代码中对图像变量的清除;我在调试代码时使用了那个显示(imshow)currFrame。
标签: matlab matlab-guide