快速屏幕捕获实时处理

时间:2012-03-22 02:08:24

标签: matlab real-time screenshot simulink

我正在编写一个使用Matlab和Java Robot类(从Matlab调用)的自动UI测试套件。基本控制流程是这个循环:

  1. 使用Robot
  2. 截取Direct X应用程序的屏幕截图
  3. 使用Matlab进行一些处理
  4. 使用Robot
  5. 以编程方式按某些键

    我需要快速且一致的时序来完成这些步骤(理想情况下,步骤1-3每200ms发生一次)。步骤2和3很好,但截图太慢,不一致和机器相关(我的笔记本电脑需要200-500毫秒的屏幕截图和我的桌面更快,但仍远低于我的理想)。 是否有任何Matlab / Simulink软件包可以更快速,更一致地截取屏幕截图?

    我已经考虑过Simulink实时Windows目标,但我无法弄清楚在simulink中截取屏幕截图是否是一种有效的输入形式(这看起来有点过分)。 我还研究了图像采集工具箱,以便使用它来拍摄屏幕截图,但不清楚它是否提供了这种功能(它主要处理硬件图像捕获设备)。 这是我用于计时目的的截图代码:

    import java.io.*;
    import java.awt.*;
    robot = Robot;
    tool = Toolkit.getDefaultToolkit();
    for n = 1:100
        tic
        img = robot.createScreenCapture(Rectangle(tool.getScreenSize()));
        pic = java_img2mat(img);
        screen = rgb2gray(pic);
        screen = screen(1:end-100,:);
        t(n) = toc;
    end
    

    用于将java图像转换为Matlab可用形式的函数:

    function image = java_img2mat(javaimg)
    import java.io.*;
    import java.awt.*;    
          H = javaimg.getHeight;
          W = javaimg.getWidth;
         % repackage as a 3D array (MATLAB image format)
      image = uint8(zeros([H,W,3]));
      pixelsData = uint8(javaimg.getData.getPixels(0,0,W,H,[]));
      for i = 1 : H
      base = (i-1)*W*3+1;
      image(i,1:W,:) = deal(reshape(pixelsData(base:(base+3*W-1)),3,W)');
      end
    end
    

2 个答案:

答案 0 :(得分:1)

使用分析器检查软件中的延迟位置,并尝试在以下几点优化代码:

http://www.mathworks.se/help/techdoc/matlab_env/f9-17018.html

http://www.mathworks.se/help/techdoc/ref/profile.html

使用DPC延迟检查程序检查您是否达到系统限制 - 这样您就可以测试运行的后台服务或在某种程度上比较图形硬件:

http://www.thesycon.de/deu/latency_check.shtml

答案 1 :(得分:0)

不确定这些年后是否有人仍在关心,但是这个人把它缩小了here

在我的机器上(大约10年前)需要花费80毫秒才能生成屏幕截图并将其转换为MATLAB友好格式。