2016-07-24 30 views
0

Ich versuche, alle Frames einiger Videos (jeder von ihnen enthält etwa 13000 Frames) mit diesem Code zu extrahieren, aber es dauert zu lange, um alle Frames zu extrahieren. Gibt es einen schnelleren Weg?Extrahieren von Frames von Video mit Matlab

filename = 'S.avi'; 
mov = VideoReader(filename); 

% Output folder 

outputFolder = fullfile(cd, 'S'); 
mkdir(outputFolder); 


%getting no of frames 
framee=100000; 
numberOfFrames = mov.NumberOfFrames; 
numberOfFramesWritten = 0; 
for frame =  1:12525 

    thisFrame = read(mov, frame); 
    framee=framee+1; 
    outputBaseFileName = sprintf('%3.3d.png', framee); 
    outputFullFileName = fullfile(outputFolder, outputBaseFileName); 
    imwrite(thisFrame, outputFullFileName, 'png'); 
%  progressIndication = sprintf('Wrote frame %4d of %d.', frame,numberOfFrames); 
%  disp(progressIndication); 
    numberOfFramesWritten = numberOfFramesWritten + 1; 

end 
progressIndication = sprintf('Wrote %d frames to folder "%s"',numberOfFramesWritten, outputFolder); 
disp(progressIndication); 
+0

Verwenden ffmpeg statt Matlab verwenden können ... – Rotem

+0

Ich weiß nicht, ob es eine optimierte Funktion in Matlab oder nicht , aber diese Operation ist definitiv parallelisierbar, so dass sich Ihre Verarbeitungszeit ein wenig verringern sollte. –

Antwort

0

Konzeptionell unterscheidet sich das nicht sehr von dem, was Sie tun, aber Sie haben eine Reihe von Umwegen in Ihrem Code.

Vermutlich könnte man einfach tun:

mov = VideoReader(filename); 
vidFrames = read(mov); 

Um Ihren Film als 4D-Array zu sammeln, und dann tut nur

for frame = 1 : size(vidFrames, 4) 
    outputBaseFileName = sprintf('%3.3d.png', frame); 
    outputFullFileName = fullfile(outputFolder, outputBaseFileName); 
    imwrite(vidFrames(:,:,:,frame), outputFullFileName, 'png'); 
end 

Und es wäre wahrscheinlich schneller sein. Auch könnten Sie wahrscheinlich parfor (oder spmd mit einem Zähler Funktionsgriff statt) verwenden, um parallelisieren noch weiter