2013-03-21 78 views
5

我剛剛使用Matlab。我想讀取一個視頻文件,並對每一幀進行一些計算並顯示每一幀。我寫了下面的代碼,但每次只顯示第一幀。任何人都可以請幫忙。逐幀讀取和顯示視頻文件

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

end 

回答

9

注: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

尊敬Parag,上面和下面的代碼段的主要區別是什麼?其實上面的代碼工作正常,但不是下面的代碼。下面的只顯示第一幀。謝謝。 – MMH 2013-03-21 05:12:24

+1

我會詳細看到並回復你。 – 2013-03-21 07:37:25

+0

最後一種方法只顯示第一幀的亮度分量。代碼應該是'imshow(vidFrames(:,:,:,i));'這樣你可以讀取每幀的亮度和色度分量。 – Akatosh 2014-04-14 13:45:35

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。

+0

VideoReader中沒有'NumberOfFrames'字段 – Temak 2015-11-25 15:38:02

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);