1

我正在尝试为图像设置动画并将其保存为 .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
4

1 回答 1

1

'getframe' 之前的 'drawnow' 可以解决问题。

于 2013-06-20T14:31:07.327 回答