循环中的 MATLAB getframe 冲突以创建动画 gif

Posted

技术标签:

【中文标题】循环中的 MATLAB getframe 冲突以创建动画 gif【英文标题】:MATLAB getframe conflict in loop to create animated gifs 【发布时间】:2013-06-19 17:12:59 【问题描述】:

我正在尝试为图像制作动画并将其保存为 .gif 文件。制作方程式后,我在循环中使用 imshow 并使用 getframe 捕获连续帧,然后将其转换为图像并再次转换为索引文件。我尝试过其他方法,但总是遇到同样的问题。即使是 Matlab 关于创建动画 gif 的文档中的示例“峰值/冲浪”函数也不会输出正确的 .gif 文件(这意味着它会因为重复帧而滞后)。

我遇到的问题是,getframe 似乎在看似随机的时间捕获前一帧而不是当前帧。这个问题在我试过的其他电脑上没有出现,所以我觉得这是我的 cpu 和图形处理器(Mac OSX 10.7.5,Macbook Pro w Retina display 17")之间的通信问题。几乎好像 CPU 处理图像的速度比 GPU 可以将它们发送到我的显示器的速度快。赞赏有关此理论的任何见解。我尝试更新 Java 和 Matlab (v.2012a) 无济于事。我还安装了最近的更新OSX,其中之一解决了视频游戏的帧刷新率问题。

当我通过取消注释“关闭”命令(请参见下面的代码)在 imshow 和 getframe 操作之间给计算机一些时间以便 getframe 无法捕获错误的图像时,.gif 会完美显示。否则,我会在输出中得到重复的帧(参见 imgur 相册中的图像)。我使用“关闭”的问题是它确实延长了执行时间(大约 4 倍)。

请参阅:http://imgur.com/a/pWCE5 以准确理解我的意思。

我的代码如下,在大多数人的计算机上无需取消注释“关闭”即可产生所需的结果。我意识到这是一个难以解决的问题,因为它似乎与我的 GPU 有关,但我不知道该怎么做……谢谢您的宝贵时间。

clear all
tic
endloop=26;
for i=1:endloop % defines height values for next loop
    if i<(endloop/2 + 2)
        f(i)=3+i;
    else
        f(i)=f(i-1)-1;
    end 
end

[x,y]=meshgrid(-256:255,-256:255); % create grid
z=sqrt(x.^2+y.^2); % define circle

for k=1:endloop
    c=(z<f(k));
    cf=fftshift(fft2(c)); % apply transform
        fl = log(1+abs(cf)); fm = max(fl(:));
        imshow(im2uint8(fl/fm)); 
    frame=getframe; % close;
    im=frame2im(frame);
    [imind,map]=rgb2ind(im,256);
    if k==1
        imwrite(imind,map,'circle3.gif','DelayTime',0.1,'LoopCount',inf);
    else
        imwrite(imind,map,'circle3.gif', 'DelayTime',0.1, 'WriteMode', 'append');
    end
end
close all
toc

【问题讨论】:

您是否尝试过在循环中移动close 命令(例如将其放在for end 之前?另外,您可以尝试将close 替换为close(gcf) 我在 Matlab 中遇到了类似的问题;真是太痛苦了!你可以试试himage = imshow(im2uint8(fl/fm)); currFrame = getframe(himage); 我总是对像frame 这样的重载matlab 函数变量名持怀疑态度。我很想知道结果如何! 您是否尝试在imshow 之后添加drawnow 命令? 【参考方案1】: 'getframe' 之前的

'drawnow' 可以解决问题。

【讨论】:

以上是关于循环中的 MATLAB getframe 冲突以创建动画 gif的主要内容,如果未能解决你的问题,请参考以下文章

matlab之getframe

将Matlab中的绘图保存为矩阵[重复]

WordPress |帖子查询 |查询帖子类别以创建子类别过滤器并将其应用于我的函数文件中的 Ajax 过滤器

matlab 制作gif动画

在内存中渲染 MATLAB 图

matlab之movie函数