【问题标题】:MATLAB: Making a video using writeVideoMATLAB:使用 writeVideo 制作视频
【发布时间】: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?你的图像变量是什么?注意有一个内置的 MATLAB image 函数。
  • 您好,谢谢您的意见。不幸的是,我尝试了drawow和pause(最多5秒)但没有奏效。更具体地说,GUI 按预期工作,但无论出于何种原因,当我使用 getframe 时,它​​总是显示初始化图而不是“新”图。在代码中,我告诉它获取整个 GUI(巧妙地命名为 gui),而不仅仅是轴/绘图。我不确定它为什么这样做,因为我已经在每次迭代后清除变量以尝试获取“新”getframe。
  • 我不知道 writeVideo 命令是否存在导致此绘图更新错误的内部问题,或者我只是忽略了某些东西
  • 我尝试使用 clear 来确保我的变量 currFrame 实际上正在获取更新的帧,而不是简单地显示初始化的帧。另外,我知道图像是一个函数。请忽略上述代码中对图像变量的清除;我在调试代码时使用了那个显示(imshow)currFrame。

标签: matlab matlab-guide


【解决方案1】:

getframe 有时会出现问题。我不确定我能否给出答案,也不能因为我的声誉而简单地发表评论,但是这个link 可能会有所帮助。从 GUI 中获取图形后,将其转换为图像,然后再转换为框架。值得一试。

【讨论】:

  • 嗨 Ne_Plus_Ultra,我已经尝试使用硬拷贝功能,你说得对,值得研究。但是,它似乎给了我完全相反的结果:它现在更新了绘图,但它现在不显示滑块或复选框。此外,我的形状是透明的,这种方法消除了不理想的透明度。这个问题让我如此悲痛似乎很奇怪,因为最初使用这个应用程序和 MATLAB 来创建我的视频似乎很容易。
【解决方案2】:

如果您将显示器设置更改为 16 位颜色,它将解决您遇到的问题。这已记录在提供的链接上。我之前的答案已被删除,因为我只提供了链接并告诉您如何解决问题(对不起),但是如果您实际单击链接并查看他们所说的内容或将显示器设置更改为 16 位颜色,一切都会正常工作。从链接中您可以看到人们自 2009 年以来就遇到了这个问题,但它在 2013 年 4 月进行了更新,所以它仍然是一个问题,将您的显示器设置更改为 16 位颜色仍然是一个解决方案。

希望这会有所帮助!

http://www.mathworks.com/matlabcentral/newsreader/view_thread/257389

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    相关资源
    最近更新 更多