视频拆帧与组帧

video2frame

import os
import cv2
import argparse


def video2frame(path, out_dir, interval=1, zfill=None):
    cap = cv2.VideoCapture(path)
    if zfill is None:
        zfill = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))//interval))
    frame = 0
    count = 0
    while True:
        success, img = cap.read()
        if success:
            if frame % interval == 0:
                cv2.imencode('.jpg', img)[1].tofile(
                    os.path.join(out_dir, 
                    str(count).zfill(zfill)+'.jpg'))
                count += 1
            frame += 1
        else: break
    print('total:' + str(count))


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='video to frame')
    parser.add_argument('--s', help='source video file')
    parser.add_argument('--t', help='target dir', default='.')
    parser.add_argument('--i', help='time interval', default=1)
    parser.add_argument('--z', help='zfill', default=0)
    args = parser.parse_args()
    if int(args.z)>0: video2frame(args.s, args.t, int(args.i), int(args.z))
    else: video2frame(args.s, args.t, int(args.i))

frame2video

import os
import cv2
import argparse
from PIL import Image
import numpy as np


def frame2video(im_dir, video_file, fps):
    im_list = os.listdir(im_dir)
    im_list.sort(key=lambda x: int(x.split('.')[0]))
    img = Image.open(os.path.join(im_dir, im_list[0]))
    videoWriter = cv2.VideoWriter(video_file, 
        cv2.VideoWriter_fourcc('m','p','4', 'v'), 
        fps, (img.size[0], img.size[1]), True)
    for img_file in im_list:
        im_name = os.path.join(im_dir, img_file)
        frame = cv2.imdecode(np.fromfile(im_name, dtype=np.uint8), -1)
        videoWriter.write(frame)
    videoWriter.release()
    print('done')


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='frame to video')
    parser.add_argument('--s', help='source image dir', default='.')
    parser.add_argument('--t', help='target video')
    parser.add_argument('--fps', help='fps', default=30)
    args = parser.parse_args()
    frame2video(args.s, args.t, int(args.fps))
原文地址:https://www.cnblogs.com/xytpai/p/14089606.html