我正在与Matlab合作。我想读取一个视频文件并在每帧进行一些计算并显示每一帧。我写了下面的代码,但每次只显示第一帧。任何人都可以帮忙。
mov=VideoReader('c:\vid\Akiyo.mp4');
nFrames=mov.NumberOfFrames;
for i=1:nFrames
videoFrame=read(mov,i);
imshow(videoFrame);
end
答案 0 :(得分:10)
注意:
mmreader
API已被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
答案 1 :(得分: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);
答案 2 :(得分: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,因为mmreader已停止使用 MATLAB。
答案 3 :(得分:0)
* =我正在创建一个函数来播放任何.avi文件作为图中的一组帧。这是做什么的。除了我的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