2016-07-24 1 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를 사용할 수 있습니다 ... – Rotem

+0

matlab에 더 최적화 된 함수가 있는지 모르겠습니다. 하지만이 작업은 확실히 병렬 처리가 가능하므로 처리 시간이 다소 단축됩니다. –

답변

0

개념적으로 이것은 당신이하는 일과별로 다르지 않지만 코드에 많은 원형 단계가 있습니다.

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

가 4 차원 배열로 동영상을 수집하려면, 다음 단지

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

을 그리고 그것은 아마도 더 빠른 것 :

은 아마도 당신은 다만 수있다. 또한 parfor (또는 대신 카운터 함수 핸들이있는 spmd)을 사용하면 더 많이 병렬 처리 할 수 ​​있습니다.