代码之家  ›  专栏  ›  技术社区  ›  André Caron

在内存中呈现MATLAB图形

  •  24
  • André Caron  · 技术社区  · 14 年前

    有没有别的选择 getframe saveas 用于将图形内容保存到光栅图像以便进一步处理?

    方法1: getframe公司

    h = figure('visible', 'off');
    a = axes('parent', h);
    
    % render using `scatter3()` or other plot function.
    
    content = frame2im(getframe(h));
    

    getframe() 在循环中执行这种渲染(即保存 content 在每次迭代时作为视频帧)。

    方法2: 另存为

    h = figure('visible', 'off');
    a = axes('parent', h);
    
    % render using `scatter3()` or other plot function.
    
    saveas(h, '/path/to/file.png');
    content = imread(/path/to/file.png');
    

    saveas() 很明显,在调用PNG编码器之前会渲染到内存中,我想要的是可能的,但是我在MATLAB文档中找不到任何只执行渲染部分的函数。

    问题 :

    你知不知道另一种表达任意 axes 光栅图像的内容?

    4 回复  |  直到 7 年前
        1
  •  9
  •   rescdsk    12 年前

    如果使用 avifile addframe ,MATLAB不会像使用 getframe .

    avi = avifile('/path/to/output');
    figure_handle = figure('visible', 'off');
    
    % ...
    for something = 1:1000
        cla
        % (draw stuff...)
        avi = addframe(avi, figure_handle);
    end
    
        2
  •  17
  •   Community Neeleshkumar S    7 年前

    我意识到这是一个老问题,但我最近又遇到了这个问题,所以我想总结一下我的发现。我的主要来源是 this page ( cached

    1. 使用 ADDFRAME 直接使用数字手柄(不使用 GETFRAME ). 这正是 @rescdsk

      hFig = figure('Visible','off');
      
      aviobj = avifile('file.avi');
      for k=1:N
          %#plot(...)
          aviobj = addframe(aviobj, hFig);
      end
      aviobj = close(aviobj);
      
    2. 使用 PRINT / SAVEAS HGEXPORT 将图形导出到图像文件,然后从磁盘中读取图像。这是你在上述问题中列出的方法2。

      hFig = figure('Visible','off');
      set(hFig, 'PaperPositionMode','auto', 'InvertHardCopy','off')
      
      aviobj = avifile('file.avi');
      for k=1:N
          %#plot(...)
          print(['-f' num2str(hFig)], '-zbuffer', '-r0', '-dpng', 'file.png')
          img = imread('file.png');
          aviobj = addframe(aviobj, im2frame(img));
      end
      aviobj = close(aviobj);
      
    3. hFig = figure('Visible','off');
      set(hFig, 'PaperPositionMode','auto')
      
      aviobj = avifile('file.avi');
      for k=1:N
          %#plot(...)
          img = hardcopy(hFig, '-dzbuffer', '-r0');
          aviobj = addframe(aviobj, im2frame(img));
      end
      aviobj = close(aviobj);
      

      实际上,这是其他函数直接或间接使用的底层函数。在可能的情况下,通过检查源代码,这里展示了相关函数的依赖关系,其中 A --> B 表示 A calls B

      saveas [M-file] --> print [M-file] --> render [private M-file] --> hardcopy [P-file]
      hgexport [P-file] --> print [M-file] --> ...
      @avifile/addframe [M-file] --> hardcopy [P-file]
      

      另一方面,GETFRAME不调用硬拷贝,而是调用一个名为CAPTURESCREEN的未记录的内置函数(尽管它似乎将在即将到来的 HG2 system -RGBImage 打印标志):

      getframe [M-file] --> capturescreen [builtin]
      

    AVIFILE 现在已弃用,您可以用较新的 VIDEOWRITER 在(2)和(3)中,但不在(1)中,因为它不支持直接传递数字句柄。

        3
  •  6
  •   Community Neeleshkumar S    7 年前

    在无头模式下启动MATLAB: matlab -noFigureWindows

    图形窗口将不显示。

    然后像往常一样简单地绘制并保存图形(当然,您不会看到任何图形输出)。例子:

    surf(peaks);
    print output.eps     %# SAVEAS works as well
    close
    

    我在运行R2010a的Windows机器上测试了上面的内容。我现在没有访问Unix机器的权限,但是我回答了 similar question 在过去,它在当时工作得很好(你需要解除 $DISPLAY 启动MATLAB之前的变量)


    编辑

    另一个选择是,如果你想保持正常的工作空间,在后台启动一个新的MATLAB实例,它将生成并保存绘图( source ).

    在当前MATLAB会话的命令提示符下运行此命令(全部位于同一行):

    !start /B /MIN matlab -noFigureWindows 
                          -automation 
                          -r "cd('c:\yourpath'); myscript; quit"
    

    myscript

    c: \yourpath\myscript.m

    surf(peaks);
    saveas(gcf, 'output.eps');
    
        4
  •  2
  •   Uri Cohen    9 年前

    avifile

    hFig = figure('Visible','off');
    set(hFig, 'PaperPositionMode','auto')
    
    aviobj = VideoWriter('file','Archival');
    for k=1:N
        %#plot(...)
        img = hardcopy(hFig, '-dzbuffer', '-r0');
        writeVideo(aviobj, im2frame(img));
    end
    close(aviobj);