Быстрые снимки экрана для обработки в реальном времени - PullRequest
2 голосов
/ 22 марта 2012

Я пишу автоматизированный набор тестов пользовательского интерфейса, используя Matlab и класс Java Robot (вызванный из Matlab). Основным потоком управления является этот цикл:

  1. сделайте снимок экрана приложения Direct X с помощью робота
  2. выполнить обработку с использованием Matlab
  3. программно нажмите некоторые клавиши с помощью робота

Мне требуется быстрое и согласованное время для этих шагов (в идеале, шаги 1-3 должны выполняться каждые 200 мс). Шаги 2 и 3 хороши, но снимок экрана слишком медленный, непоследовательный и зависит от компьютера (мой ноутбук требует 200-500 мс для захвата экрана и мой рабочий стол быстрее, но все еще далеко от моего идеала). Существуют ли какие-либо пакеты Matlab / Simulink, которые позволили бы более быструю и согласованную синхронизацию снимков экрана?

Я рассматривал цель Windows для Simulink Real-Time, но не могу понять, является ли создание снимка экрана допустимой формой ввода в 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 ]

1 голос
/ 27 апреля 2012

Используйте профилировщик, чтобы проверить, где в программном обеспечении у вас есть задержки, и попытаться оптимизировать код в следующих точках:

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

0 голосов
/ 17 ноября 2016

Не уверен, что кому-то все равно все эти годы, но этот парень сузил его здесь .

На моем компьютере (возраст которого приблизительно 10 лет) требуется около 80 мс для создания снимка экрана и его преобразования в формат MATLAB.

...