(来点有用的)MATLAB从截屏到录屏

(来点有用的)MATLAB从截屏到录屏


by HPC_ZY

依赖

主要利用java提供的awt软件包,MATLAB已内置安装。此处仅介绍录制方案,感兴趣可百度搜索“java.awt”。


截屏

  1. 创建java.awt类
robot = java.awt.Robot(); % 创建监视类(用于监视屏幕)
rectangle = java.awt.Rectangle(); % 创建矩形类(用于设定截屏范围)
  1. 设置参数
    在这里插入图片描述
% 定义见上图
rectangle.x = 200; % 截图左上角横坐标
rectangle.y = 200; % 截图左上角纵坐标
rectangle.width = 1000; % 截图宽度
rectangle.height = 800; % 截图高度
  1. 截屏+导出数据
% 截取屏幕
image = robot.createScreenCapture(rectangle);
% 获取截屏数据
data = image.getData(); 
% 获取像素信息
temp = zeros(1000*800*3,1); % 初始化数组用于存储RGB像素信息(长**通道数)
temp = data.getPixels(0,0,1000,800,temp);  
  1. 转换数据格式
    (1)由于导出的数据是一维数组,且以像素顺序存储,如:[r1,g1,b1,r2,g2,b2,……]
    红色通道下标:3i-2
    绿色通道下标:3i-1
    蓝色通道下标:3i
    (2)java中行优先,MATLAB列优先,所以导出数据行列相反,需转置
temp = uint8(temp); % 原数据为double类型
% 提取三通道像素值
R = temp(1:3:end); 
G = temp(2:3:end); 
B = temp(3:3:end);
% 修改数据尺寸
R = reshape(R,[1000,800]); 
G = reshape(G,[1000,800]); 
B = reshape(B,[1000,800]);
% 转置
R = R';
G = G';
B = B';
% 合并
im = cat(3,R,G,B);

录屏

利用循环实现录屏功能

  1. 连续截屏
    将初始化写到循环外,将获取屏幕数据写在循环内即可
% 创建java.awt类
% (省略)
% 设置参数
% (省略)


N = 100; % 截屏次数
video = zeros(W*H*3,N); % 初始化数组存储数据
for k = 1:N
% 截屏+导出数据=得到temp
% (省略)
video(:,k) = temp;
end
  1. 录制视频
    连续截屏生成的不能算是视频,视频由“等时间间隔的连续帧”组成。
    要让循环按照规定的时间间隔执行,故加入以下代码
fps = 24; % 视频帧数
tpf = 1/fps; % 每帧间隔
for k = 1:N
tic % 计时标记

% 截屏+导出数据
% (省略)
video(:,k) = temp;

t = toc; % 获取截屏时间开销
pause(tpf-t) % 暂停(tpf-t)秒

end

注: 帧数需满足以下条件才能保证视频流畅(单次截屏时间由电脑配置决定)
fps<1/(单次截屏平均耗时)


其他

这只是一个简单的脚本,如果要做能实时操作的可视化界面,可以将代码整合到GUI。
欢迎交流。

最后附上完整代码

clear;close all;clc

% 初始化
robot = java.awt.Robot();
rectangle = java.awt.Rectangle();

% 设置参数(此处录制全屏)
SIZE = get(0,'screensize'); % 获取显示器尺寸
H = SIZE(4);
W = SIZE(3);
rectangle.x = 1; 
rectangle.y = 1; 
rectangle.width = W; 
rectangle.height = H; 

% 录屏
T = 15; % 录制时间15秒
fps = 24; 
tpf = 1/fps;
video = zeros(W*H*3,T*fps);
temp = zeros(W*H*3,1);

for k = 1:T*fps
tic
image = robot.createScreenCapture(rectangle); 
data = image.getData(); 
video(:,k) = data.getPixels(0,0,W,H,temp); 
t = toc;
pause(tpf-t)
end

% 转换格式+写视频
myVideo = VideoWriter('myvideo.avi'); % 初始化一个avi文件
myVideo.FrameRate = fps; % 设置帧数
open(myVideo); % 打开
for i = 1:T*fps 
   R = obj.video(1:3:end,i);
   R = reshape(R,[W,H]);
   R = R';
   G = obj.video(2:3:end,i);
   G = reshape(G,[W,H]);
   G = G';
   B = obj.video(3:3:end,i);
   B = reshape(B,[W,H]);
   B = B';      
   Frame=cat(3,R,G,B);
   writeVideo(myVideo,Frame); % 写入
end
close(myVideo); % 关闭

猜你喜欢

转载自blog.csdn.net/xsz591541060/article/details/84786165