5

我刚开始使用 Matlab。我想读取视频文件并每帧进行一些计算并显示每一帧。我编写了以下代码,但每次它只显示第一帧。有人可以帮忙吗?

mov=VideoReader('c:\vid\Akiyo.mp4');
nFrames=mov.NumberOfFrames;
for i=1:nFrames
  videoFrame=read(mov,i);
  imshow(videoFrame);

end
4

4 回答 4

10

注意:mmreaderAPI 已被 MATLAB 停用,因此更喜欢使用VideoReader.

请参阅@Vivek 的评论。

我通常这样做:

obj=mmreader('c:\vid\Akiyo.mp4');
nFrames=obj.NumberOfFrames;
for k=1:nFrames
    img=read(obj,k);
    figure(1),imshow(img,[]);
end

就您的代码而言,我看到了 MATLAB 的文档。您应该按以下顺序进行操作:

mov=VideoReader('c:\vid\Akiyo.mp4');
vidFrames=read(mov);
nFrames=mov.NumberOfFrames;
for i=1:nFrames
   imshow(vidFrames(:,:,i),[]);  %frames are grayscale
end
于 2013-03-21T03:31:28.547 回答
1

函数 read() 和字段 NumberOfFrames() 现在已弃用,Matlab 建议使用

xyloObj = VideoReader(file);
vidHeight = xyloObj.Height;
vidWidth = xyloObj.Width;
mov = struct('cdata',zeros(vidHeight, vidWidth, 3,'uint8'), 'colormap',[]);

while hasFrame(xyloObj)
    mov(k).cdata = readFrame(xyloObj,'native');     
end

如果您想估计视频中的帧数,请使用nFrames = floor(xyloObj.Duration) * floor(xyloObj.FrameRate);

于 2016-08-14T00:46:37.853 回答
0

下面建议的代码只显示一帧

imshow(vidFrames(:,:,i),[]);

我正在做以下事情来存储每一帧

obj = VideoReader('path/to/video/file');

for img = 1:obj.NumberOfFrames;
    filename = strcat('frame',num2str(img),'.jpg');
    b = read(obj,img);
    imwrite(b,filename);
end

这会将所有帧存储在您的主目录中。是的,正如 Vivek 和 Parag 所建议的那样

您需要使用 VideoReader,因为 MATLAB 已停止使用 mmreader。

于 2015-10-23T05:43:55.157 回答
0

*=我正在制作一个函数来播放任何 .avi 文件作为图中的一组帧。这是 a 所做的。你所做的一些组合,除了我的 NumberOfFrames 没有工作:(注意这也显示它的颜色)

function play_video(filename)
% play_video  Play a video file
% play_video(filename) plays the video file specified by filename in a MATLAB Figure window.

figure
set(figure, 'Visible', 'on')
mov=VideoReader(filename);
vidFrames=read(mov);
duration = mov.Duration;
frame_rate = mov.FrameRate;
total_frames = duration .* frame_rate


for i=1:1:total_frames
   imshow(vidFrames(:, :, :, i), []);
   drawnow
end
于 2018-05-02T04:32:17.080 回答