如何从yuv 420视频剪辑中提取帧并使用matlab将它们存储为不同的图像?

时间:2010-09-01 01:27:31

标签: matlab image-processing frame video-processing yuv

如何从yuv 420视频中提取帧?假设我想将它们存储为静止图像。怎么样?

3 个答案:

答案 0 :(得分:1)

以下是来自MathWorks File Exchange的提交内容,应提供您想要的内容:

上面提交的函数loadFileYuv将加载YUV文件并返回一组电影帧。每个电影帧都是具有以下字段的结构:

  • cdatauint8值的矩阵。尺寸是按宽度乘以3。
  • colormap:N-by-3双打矩阵。它在真彩色系统上是空的。

因此,您可以从数组中的每个电影帧中提取cdata字段,并将其保存/用作RGB图像。

您的代码可能如下所示:

nFrames = 115;     %# The number of frames
vidHeight = 352;   %# The image height
vidWidth = 240;    %# The image width
mov = loadFileYuv('myVideo.yuv',vidHeight,vidWidth,1:nFrames);  %# Read the file
for k = 1:nFrames  %# Loop over the movie frames
  imwrite(mov(k).cdata,['myImage' int2str(k) '.bmp']);  %# Save each frame to
                                                        %#   a bitmap image file
end

答案 1 :(得分:0)

抱歉对matlab无济于事,但在命令行上你可以用ffmpeg

来做
ffmpeg -i input.yuv -r 1 -f image2 images%05d.png

-r 1表示rate =每帧

答案 2 :(得分:0)

您可以使用以下代码:

vidObj1 = mmreader('testballroom_0.avi');  %# Create a video file object
nFrames = vidObj1.NumberOfFrames;   %# Get the number of frames
vidHeight1 = vidObj1.Height;         %# Get the image height
vidWidth1 = vidObj1.Width;           %# Get the image width

%# Preallocate the structure array of movie frames:

mov1(1:nFrames) = struct('cdata',zeros(vidHeight1,vidWidth1,3,'uint8'),...
                    'colormap',[]);  %# Note that colormap is empty!

您可以从矩阵mov1:)

访问每个帧