Spaces:
Running
Running
import os | |
import cv2 | |
def main(): | |
import argparse | |
pars = argparse.ArgumentParser(description='Frames to video converter') | |
pars.add_argument('frames', type=str, help='Frames directory') | |
pars.add_argument('vidname', type=str, help='Output video name') | |
pars.add_argument('-o', '--outpath', type=str, default=None, help='Save record') | |
pars.add_argument('--fps', type=int, default=30, help='Frames per second') | |
pars.add_argument('--shape', nargs='+', type=int, help='Visualizer shape (W,H)') | |
args = pars.parse_args() | |
if args.shape: | |
if len(args.shape) != 2: | |
raise ValueError('--shape requires two values: width and height. Ej: --shape 256 256') | |
else: | |
video_shape = tuple(args.shape) | |
else: | |
video_shape = None | |
frames2video(args.frames, args.vidname, video_path=args.outpath, video_shape=video_shape, fps=args.fps) | |
def frames2video(frames_path, video_name, video_path=None, video_shape=None, fps=30): | |
frames_names = sorted(os.listdir(frames_path)) | |
if video_path is None: | |
video_path = frames_path + '/vid_out/' | |
if not os.path.exists(video_path): | |
os.makedirs(video_path) | |
video_file = os.path.join(video_path, video_name + '.mp4') | |
if video_shape is None: | |
video_writer = None | |
else: | |
vid_w, vid_h = video_shape | |
video_writer = cv2.VideoWriter(video_file, cv2.VideoWriter_fourcc(*'MP4V'), fps, (vid_w, vid_h)) | |
for frame_name in frames_names: | |
if frame_name.split('.')[-1] not in ['jpg', 'jpeg', 'png', 'tif', 'tiff', 'eps', 'bmp', 'gif']: | |
print('File %s format doesnt match with an image ' % frame_name) | |
continue | |
frame_file = os.path.join(frames_path, frame_name) | |
frame = cv2.imread(frame_file) | |
if video_writer is None: | |
vid_h, vid_w = frame.shape[:2] | |
video_writer = cv2.VideoWriter(video_file, cv2.VideoWriter_fourcc(*'MP4V'), fps, (vid_w, vid_h)) | |
if frame.shape[:2] != (vid_h, vid_w): | |
frame = cv2.resize(frame, (vid_w, vid_h)) | |
video_writer.write(frame) | |
video_writer.release() | |
if __name__ == '__main__': | |
main() | |