2013-06-19 18 views
1

我试图给图像设置动画并将其保存为.gif文件。在制作一个公式之后,我在一个循环中使用imshow并使用getframe捕获连续的帧,然后将其转换为图像并再次转换为索引文件。我尝试了其他方法,但总是遇到同样的问题。即使Matlab创建动画GIF文档中的“峰值/冲浪”功能样本也不会输出正确的.gif文件(这意味着它由于重复的帧而滞后)。MATLAB中的getframe冲突创建动画gif

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

当我通过取消注释'close'命令(请参阅下面的代码)在imshow和getframe操作之间给予计算机一段时间以便getframe不可能捕获错误图像,.gif完美呈现出来,否则,我会在输出中看到重复的帧(参见imgur专辑中的图片)。我使用'close'的问题是,它真的会延长执行时间(约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 
+0

您是否试过在循环中移动'close'命令(比如在'end'之前放置它?此外,您可以尝试用'close(gcf)'替换'close'。 –

+1

我已经麻烦与Matlab中的图形类似;它是如此的痛苦!你可以试试'himage = imshow(im2uint8(fl/fm)); currFrame = getframe(himage);'''''''' 'frame'。我很想听听这是怎么回事! – macduff

+1

你有没有试图在'imshow'之后添加'drawnow'命令? – Chrigi

回答