Я пишу автоматизированный набор тестов пользовательского интерфейса, используя Matlab и класс Java Robot (вызванный из Matlab). Основным потоком управления является этот цикл:
- сделайте снимок экрана приложения Direct X с помощью робота
- выполнить обработку с использованием Matlab
- программно нажмите некоторые клавиши с помощью робота
Мне требуется быстрое и согласованное время для этих шагов (в идеале, шаги 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