我目前正在尝试使用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);
答案 0 :(得分:1)
getframe有时会出现问题。我不确定我能给出答案,因为我的声誉,我不能简单地发表评论,但这link可能会有所帮助。从GUI获取图形后,将其转换为图像,然后转换为框架。值得一试。
答案 1 :(得分:0)
如果您将显示器设置更改为16位颜色,它将解决您遇到的问题。这已在所提供的链接中记录。我之前的回答被删除了,因为我只提供了链接并告诉你如何解决问题(对不起),但如果你实际点击链接并看到他们说的话或将你的显示器设置改为16位颜色,一切都会有效。从链接中你可以看到人们自2009年以来就遇到过这个问题,但它已于2013年4月更新,因此它仍然是一个问题,将显示器设置更改为16位颜色仍然是一个解决方案。
希望这有帮助!
http://www.mathworks.com/matlabcentral/newsreader/view_thread/257389