Micah T
Micah T

Reputation: 11

MATLAB: How do I name files in a for loop in numerical order?

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

Answers (1)

Zep
Zep

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

Related Questions