一、视频文件的读取及帧图像的保存
%% Get frames from video
% Author: 羽墨志(https://yumozhi.com/)
% Date : 2022-06-01
%% Introduction
% 读取视频并保存视频帧图像到指定目录
v_pathname = 'D:\Kevin\GitSyncdisk\Video\';
v_filename = 'map.mp4';
f_pathname = 'D:\Kevin\GitSyncdisk\Video\Frame\'; % 目录需要预先创建
f_filename = 'map_frame_'; % 图片文件名的前缀,可以根据自己喜好自行定义
height = 480;
width = 640;
v = VideoReader([v_pathname, v_filename]); % 方式一
% v = VideoReader(strcat(v_pathname, v_filename)); % 方式二
% v = VideoReader(sprintf('%s%s',v_pathname, v_filename)); % 方式三
% v = VideoReader('D:\Kevin\GitSyncdisk\Video\map.mp4'); % 方式四
n_frame = 0;
while hasFrame(v)
frame = readFrame(v);
gray_img = rgb2gray(frame); % 转换为灰阶图像
gray_img = imresize(gray_img, [height, width], 'bilinear'); % 调整图像大小
n_frame = n_frame + 1;
% 方式一
% imwrite(gray_img, [f_pathname, f_filename, num2str(n_frame), '.jpg']);
% 方式二
% imwrite(gray_img, strcat(f_pathname, f_filename, num2str(n_frame), '.jpg'));
% 方式三
imwrite(gray_img, sprintf('%s%s%d%s', f_pathname, f_filename, n_frame, '.jpg'));
end
二、字符串拼接的几种方式
待读取视频的目录结构比较简单,可直接手动拼接后写入,如方式四。有时候为了后续方便,也会根据实际需求将其合理的拆分为几个部分(本文中分为了目录和文件名两个部分),在根据需要进行拼接。对于从视频中读取到的视频帧而言,其数量一般较多,难以为每一幅图像手动构建一个名称后保存,所以需要通过动态拼接的方式生成一系列具有某种规律的文件名,这就意味着图像文件名中一定会包含某些变量,本文中展示了了三种动态拼接字符串的方式:
% 方式一
% imwrite(gray_img, [f_pathname, f_filename, num2str(n_frame), '.jpg']);
% 方式二
% imwrite(gray_img, strcat(f_pathname, f_filename, num2str(n_frame), '.jpg'));
% 方式三
imwrite(gray_img, sprintf('%s%s%d%s', f_pathname, f_filename, n_frame, '.jpg'));
其中n_frame
即为文件名中包含的变量,与每一幅帧图像是一一对应的。在三种方式中,第三种方式更为灵活,可以添加格式控制来输出对应的数字字符串。例如将数字部分按照4位输出:
sprintf('%04d', var);
值得注意的是,当var的实际宽度大于前面的控制宽度时会按照实际宽度输出。
三、将帧图像转换为灰度图像
gray_img = rgb2gray(frame); % 转换为灰阶图像
四、调整图片的分辨率
本文中利用的是bilinear算法将图片调整到自己想要的大小。
gray_img = imresize(gray_img,[height,width],'bilinear'); % 调整图像大小