我试图给图像设置动画并将其保存为.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
您是否试过在循环中移动'close'命令(比如在'end'之前放置它?此外,您可以尝试用'close(gcf)'替换'close'。 –
我已经麻烦与Matlab中的图形类似;它是如此的痛苦!你可以试试'himage = imshow(im2uint8(fl/fm)); currFrame = getframe(himage);'''''''' 'frame'。我很想听听这是怎么回事! – macduff
你有没有试图在'imshow'之后添加'drawnow'命令? – Chrigi