2013-03-21 40 views
5

Tôi mới làm việc với Matlab. Tôi muốn đọc một tập tin video và làm một số tính toán mỗi khung hình và hiển thị mỗi khung hình. Tôi đã viết đoạn mã sau nhưng mỗi lần nó chỉ hiển thị khung đầu tiên. ai cũng có thể giúp được.đọc và hiển thị khung tệp video theo khung

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

end 

Trả lời

9

Lưu ý: mmreader API đã hết hiệu lực bởi MATLAB rất thích sử dụng VideoReader.

Xem nhận xét của @Vivek.

Tôi thường làm điều này:

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

Theo như mã của bạn là có liên quan, tôi thấy tài liệu hướng dẫn của MATLAB. Bạn nên làm những việc theo thứ tự sau đây:

mov=VideoReader('c:\vid\Akiyo.mp4'); 
vidFrames=read(mov); 
nFrames=mov.NumberOfFrames; 
for i=1:nFrames 
    imshow(vidFrames(:,:,i),[]); %frames are grayscale 
end 
+1

thân mến Parag, sự khác biệt chính giữa các đoạn mã trên và dưới đây là gì. Trên thực tế các mã trên là làm việc tốt nhưng không phải là dưới đây. bên dưới chỉ hiển thị khung hình đầu tiên. cảm ơn. – MMH

+1

Tôi sẽ xem chi tiết và liên hệ lại với bạn. –

+0

phương pháp cuối cùng chỉ hiển thị thành phần luma của khung hình đầu tiên. Mã nên là 'imshow (vidFrames (:,:,:, i));' Bằng cách này bạn có thể đọc thành phần luma và chroma của mỗi khung. – Akatosh

0

Dưới đây đang đề nghị chỉ hiển thị một khung hình

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

Tôi đang làm những điều sau đây để lưu trữ mỗi khung

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 

này sẽ lưu trữ tất cả các khung trong thư mục chính của bạn.Và có, cũng như được đề xuất bởi Vivek và Parag

Bạn cần sử dụng VideoReader vì mmreader đã bị ngừng bởi MATLAB.

+0

Không có trường 'NumberOfFrames' trong VideoReader – Temak

1

Chức năng đọc() và NumberOfFrames trường() hiện đang bị phản đối, Matlab cho thấy sử dụng

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 

Trong trường hợp bạn muốn ước tính một số khung hình trong đoạn video, sử dụng nFrames = floor(xyloObj.Duration) * floor(xyloObj.FrameRate);

Các vấn đề liên quan