情节中的像素:getframe太慢了

时间:2015-11-04 10:57:01

标签: image performance matlab plot matlab-figure

我需要做以下事情:

  • 我有一个固定的环境,其中有一个点
  • 在每个时间点,点移动,我需要截取当前状态的截图(环境+点)

我的工作是

function getPixels(state)
    fig = figure('visible','off')
    hold all
    plot_environment()              % calls patch and other stuff 
    plot(state(1),state(2),'r+')
    f = getframe();
    data = f.cdata;
    close(fig)

问题是它非常慢(0.6s对我来说实在是太多了)。 我尝试使用persistent fig,我可以下到0.4s,但仍然太多。

我读过关于使用printhardcopy的内容,但它没有帮助。即使按-r20(默认大小为1/5)减少像素数也不会加快速度。

有什么建议吗?是否有更快的方法来获取像素?

编辑:其他详细信息

state仅为2分。

环境由用于绘制形状的一些固定已知变量定义。更具体地说,我有一些观点

points = [c11 c12
           c21 c22
           .....]

用于修补矩形,圆形和三角形。为此,我使用patchcircles

所以最后我想将所有内容绘制在一起,得到结果像素。有没有办法在没有getframe或加快速度的情况下做到这一点?

完整示例

需要circles

启动tic, getPixels([0.1, 0.2]'); toc 平均需要0.43s。仅getframe命令需要0.29s

function data = getPixels(state)

fig = figure('visible','off');
hold all

c1 = [0.1 0.75; 
    0.45 0.75];
c2 = [0.45 0.4; 
    0.45 0.8];

radius = 0.1;

grey = [0.4,0.4,0.4];

% Circles
p = [c1; c2];
circles(p(:,1), p(:,2), radius, 'color', grey, 'edgecolor', grey)

% Rectangles
patch([0.1 0.45 0.45 0.1], [0.65 0.65 0.85 0.85], grey, 'EdgeAlpha', 0)
patch([0.35 0.55 0.55 0.35], [0.4 0.4 0.8 0.8], grey, 'EdgeAlpha', 0)

% Triangle
x = [0.95, 1.0, 1.0];
y = [1.0, 0.95, 1.0];
fill(x, y, 'r')

axis([0 1 0 1])

box on
axis square

% Point
plot(state(1),state(2),'ro','MarkerSize',8,'MarkerFaceColor','r'); 

f = getframe();
data = f.cdata;
close(fig)

1 个答案:

答案 0 :(得分:2)

您可以将Matlab的getframe()函数的执行时间缩短十倍。每次调用getPixels()函数但使用现有函数时,诀窍包括不创建数字。您可以通过函数参数传递图形句柄。并使用Matlab的函数clf清除两次调用之间的当前数字窗口。

修改

以下是我与figure et getframe一起玩的方式示例。

以下表现图

enter image description here

提供
%%

clear al
close all
clc

nbSim = 10  %number of getframe calls
tElapsed = zeros(nbSim, 2); %two types of getting frames


%% METHOD 1: figure within loop

for ind_sim = 1:nbSim

    fig = figure;

    %some graphical elements
    hold all
    patch(rand(1,4), rand(1,4), rand(1,3), 'EdgeAlpha', 0)
    patch(rand(1,4), rand(1,4), rand(1,3), 'EdgeAlpha', 0)
    fill(rand(1,3), rand(1,3), 'r')
    plot(rand,rand,'ro','MarkerSize',8,'MarkerFaceColor','k');

    %some axes properties
    axis([0 1 0 1])
    box on
    axis square

    tStart = tic;
    f = getframe();
    tElapsed(ind_sim,1) = toc(tStart);
    data = f.cdata;
    close(fig)

end


%% METHOD 2: figure outside loop

fig = figure;
for ind_sim = 1:nbSim

    %some graphical elements
    hold all
    patch(rand(1,4), rand(1,4), rand(1,3), 'EdgeAlpha', 0)
    patch(rand(1,4), rand(1,4), rand(1,3), 'EdgeAlpha', 0)
    fill(rand(1,3), rand(1,3), 'r')
    plot(rand,rand,'ro','MarkerSize',8,'MarkerFaceColor','k');

    %some axes properties
    axis([0 1 0 1])
    box on
    axis square

    tStart = tic;
    f = getframe();
    tElapsed(ind_sim,2) = toc(tStart);
    data = f.cdata;
    clf

end
close(fig)

%% plot results

plot(tElapsed);
set(gca, 'YLim', [0 max(tElapsed(:))+0.1])
xlabel('Number of calls');
ylabel('Execution time');
legend({'within (method 1)';'outside (method 2)'});
title('GetFrame exectution time');

即使宣布图形不可见,也必须删除图形的创建。这会影响执行时间。