Reputation: 11
I am trying to extract specific frames from a video file into images. This code is currently outputting the correct images, but the numbers names of the files are out of order. The output file names for 12 images are in the order: frame_0.tif, frame_8.tif, frame_3.tif, etc. I need the files to output in order: frame_0.tif, frame_1.tif, frame_2.tif, etc.
function vid_to_img(NumImages,VideoFile)
VideoRead = VideoReader(VideoFile);
CurFrame = 0;
TotalFrames = VideoRead.FrameRate*VideoRead.Duration;
DFrames = fix(TotalFrames/NumImages); %change in frames
ImageFrames = (1:DFrames:TotalFrames); %selected frames
NewImg = (0:1:NumImages);
while hasFrame(VideoRead)
for i = NewImg %file number matrix
CurImage = readFrame(VideoRead);
CurFrame = CurFrame+1;
if ismember(CurFrame, ImageFrames)
imwrite(CurImage, sprintf('frame_%d.tif', i));
end
end
end
end
Upvotes: 0
Views: 78
Reputation: 1576
You should add a counter outside your loop and only count the frames you actually take:
output_idx = 0;
while hasFrame(VideoRead)
CurImage = readFrame(VideoRead);
CurFrame = CurFrame+1;
if ismember(CurFrame, ImageFrames)
output_idx = output_idx + 1; % Only counting the frames you actually take
imwrite(CurImage, sprintf('frame_%d.tif', output_idx));
end
end
Upvotes: 1