在MATLAB中从视频中返回一个帧数组

时间:2014-07-26 00:12:06

标签: arrays matlab video-processing

我有代码来捕获视频的帧。我需要把前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);

1 个答案:

答案 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