循环中的 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的主要内容,如果未能解决你的问题,请参考以下文章