Trouble in making video from frames, can anyone help?

11 次查看(过去 30 天)
Hi,
I have around 1000 pictures which is like 30th frame from each second of 30 fps. I am trying to make a video with 1 fps hence I am using the code below but the problem is this code is not compiling the video in a sequence manner like frame30.jpg, frame60. jpg instead frames are messed up in video like starting from middle then finish then add the starting frames at the end. what i want is a it reads a frames from first to last hence made a video. I am not sure where I am making a mistake.
Code:
imgFile =dir('*.jpg');
N = length(imgFile);
% create the video writer with 1 FPS
writerObj = VideoWriter('compilingFrames.avi');
writeObj.FrameRate = 1;
%Open the video writer
open(writerObj);
%write the frame to the video
for i=1:N
img = imgFile(i).name;
I = imread(img);
writeVideo(writerObj,I);
end
% close the writer object
close(writerObj);

采纳的回答

Walter Roberson
Walter Roberson 2021-8-31
Or if the frames are named strictly sequentially and have a predictable prefix, then generate the file names instead of reading them from the directory.
videofile = 'compilingFrames.avi';
writerObj = VideoWriter(videofile);
writeObj.FrameRate = 1;
%Open the video writer
open(writerObj);
N = 1;
while true
filename = sprintf('frame%d.jpg', N);
if ~exist(filename); break; end
try
I = imread(filename);
catch ME
fprintf('Failed to read file "%s", giving up', filename);
break;
end
writeVideo(writerObj, I);
N = N + 1;
end
%to get here we ran out of sequential files, or a file was not readable
% close the writer object
close(writerObj);
if N == 1
fprintf('No frames were written at all, deleting movie!\n');
delete(videofile);
elseif N == 2
fprintf('Only one frame was written to movie, but need at least two for valid movie, deleting movie\n');
delete(videofile);
else
fprintf('Wrote %d frames succesfully\n', N-1);
end
  4 个评论
muhammad choudhry
muhammad choudhry 2021-8-31
Thanks, it worked with the frame sequence but still there is one problem which is the frame rate I wanted the frame rate to be 1 fps but it is going like 100 fps, video is too fast, even I mention in the code 1 fps but it did not implement it.
Walter Roberson
Walter Roberson 2021-8-31
The line that is already in the code,
writeObj.FrameRate = 1;
should take care of that.
As an experiment, after the above code, try
v = VideoReader(videofile);
if isfield(v, 'FrameRate')
fprintf('Frame rate stored in file is: %g\n', v.FrameRate);
else
fprintf('Somehow file does not have any recorded FrameRate??\n');
end
clear v

请先登录,再进行评论。

更多回答(1 个)

Chunru
Chunru 2021-8-31
编辑:Chunru 2021-8-31
If your image file names are well behaved, you can do a simple sorting of the file names:
imgFile =dir('*.jpg');
imgFile = sort({imgFile.name}'); % sort the file name
N = length(imgFile);
% create the video writer with 1 FPS
writerObj = VideoWriter('compilingFrames.avi');
writeObj.FrameRate = 1;
%Open the video writer
open(writerObj);
%write the frame to the video
for i=1:N
img = imgFile{i}; %.name;
I = imreadimg);
writeVideo(writerObj,I);
end
% close the writer object
close(writerObj);
  4 个评论
muhammad choudhry
muhammad choudhry 2021-8-31
it compiled the frames into video same as before, no difference. Is there anyway I can define int he code that start read the frame from frame30.jpg then go to frame60.jpg, then go to frame90.jpg until the last frame ?
Chunru
Chunru 2021-8-31
Yes. You can define the frame sequence with the order you want:
imgFile ={'filename1.jpg', 'filename2.jp', ....}

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Tracking and Motion Estimation 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by