2016-07-24 15 views
0

私はこのコードでいくつかのビデオ(それぞれに約13000フレームが含まれています)のすべてのフレームを抽出しようとしていますが、すべてのフレームを抽出するには時間がかかります。それ以上の素早い方法がありますか?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

使用は、MATLABの代わりにffmpegのを使用することができます並列化する(関数が代わりに扱うカウンターまたはspmdparforを使用することができます... – Rotem

+0

がより最適化された機能は、MATLABでだかどうかはわかりませんしかし、この操作は確実に並列化できるので、処理時間を少し削減する必要があります。 –

答えて

0

概念的にはこれはあなたのやり方とあまり変わりありませんが、あなたのコードには多くのラウンドアバウトステップがあります。

おそらくあなただけ行うことができます:4D配列としてムービーを収集するには

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

、その後、ちょうど

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

を行うと、それはおそらく速いだろう。また、あなたはおそらくさらに

関連する問題