我有代码来捕获视频的帧。我需要把前20帧放在一个数组中。我怎样才能做到这一点?以下是我的代码:
filename = 'Wildlife.wmv';
mov = mmreader(filename);
% Output folder
outputFolder = fullfile(cd, 'frames');
if ~exist(outputFolder, 'dir')
mkdir(outputFolder);
end
%getting no of frames
numberOfFrames = mov.NumberOfFrames;
numberOfFramesWritten = 0;
for frame = 1 :20
thisFrame = read(mov, frame);
outputBaseFileName = sprintf('%3.3d.bmp', frame);
outputFullFileName = fullfile(outputFolder, outputBaseFileName);
imwrite(thisFrame, outputFullFileName, 'bmp');
progressIndication = sprintf('Wrote frame %4d of %d.', frame,numberOfFrames);
disp(progressIndication);
numberOfFramesWritten = numberOfFramesWritten + 1;
end
progressIndication = sprintf('Wrote %d frames to folder "%s"',numberOfFramesWritten,outputFolder);
disp(progressIndication);
答案 0 :(得分:0)
只需将每个框架放入3D阵列,然后返回堆叠的3D阵列即可。因此,在for
循环之前,请执行以下操作:
videoFrames = [];
在for
循环内,在read
语句后,执行以下操作:
videoFrames = cat(3,videoFrames,thisFrame);
以上情况仅涵盖灰度图像。对于彩色图像,您需要创建一个4D阵列,因为第三个维度将是颜色通道。换句话说,这样做:
videoFrames = cat(4,videoFrames,thisFrame);
要使此颜色或灰度不可知,您可以检查size
方法返回的维数。 size
会返回包含每个维度大小的N x 1
向量,N
将是维度的总数。如果它是2D阵列(灰度),则它将是2元素阵列;如果是3D阵列(颜色),则是3元素阵列。因此,您可以将上述两个语句更改为单个语句,以便:
videoFrames = cat(numel(size(thisFrame)) + 1, videoFrames, thisFrame);
您只需计算有多少维度,并在下一维度中将堆叠加1。
如果您想访问i th 框架,您可以执行以下操作:
frame = videoFrames(:,:,i); %// Grayscale
frame = videoFrames(:,:,:,i); %// Colour