In [1]:
import cv2
import os

In [2]:
def save_all_frames(video_path, dir_path, basename, ext='jpg'):
    cap = cv2.VideoCapture(video_path)
    
    if not cap.isOpened():
        return
    
    os.makedirs(dir_path, exist_ok=True)
    base_path = os.path.join(dir_path, basename)
    
    digit = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))))
    
    n = 0

    while True:
        ret, frame = cap.read()
        if ret:
            cv2.imwrite('{}_{}.{}'.format(base_path, str(n).zfill(digit), ext), frame)
            n += 1
        else:
            return

In [3]:
save_all_frames('data/temp/sample_video.mp4', 'data/temp/result', 'sample_video_img')

In [4]:
save_all_frames('data/temp/sample_video.mp4', 'data/temp/result_png', 'sample_video_img', 'png')

In [5]:
def save_frame(video_path, frame_num, result_path):
    cap = cv2.VideoCapture(video_path)
    
    if not cap.isOpened():
        return
    
    os.makedirs(os.path.dirname(result_path), exist_ok=True)
    
    cap.set(cv2.CAP_PROP_POS_FRAMES, frame_num)
    
    ret, frame = cap.read()
    
    if ret:
        cv2.imwrite(result_path, frame)

In [6]:
save_frame('data/temp/sample_video.mp4', 100, 'data/temp/result_single/sample_100.jpg')

In [7]:
def save_frame_range(video_path, start_frame, stop_frame, step_frame,
                     dir_path, basename, ext='jpg'):
    cap = cv2.VideoCapture(video_path)
    
    if not cap.isOpened():
        return
    
    os.makedirs(dir_path, exist_ok=True)
    base_path = os.path.join(dir_path, basename)
    
    digit = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))))
    
    for n in range(start_frame, stop_frame, step_frame):
        cap.set(cv2.CAP_PROP_POS_FRAMES, n)
        ret, frame = cap.read()
        if ret:
            cv2.imwrite('{}_{}.{}'.format(base_path, str(n).zfill(digit), ext), frame)
        else:
            return

In [8]:
save_frame_range('data/temp/sample_video.mp4',
                 200, 300, 10,
                 'data/temp/result_range', 'sample_video_img')

In [9]:
def save_frame_sec(video_path, sec, result_path):
    cap = cv2.VideoCapture(video_path)
    
    if not cap.isOpened():
        return
    
    os.makedirs(os.path.dirname(result_path), exist_ok=True)
    
    fps = cap.get(cv2.CAP_PROP_FPS)
    
    cap.set(cv2.CAP_PROP_POS_FRAMES, round(fps * sec))
    
    ret, frame = cap.read()
    
    if ret:
        cv2.imwrite(result_path, frame)

In [10]:
save_frame_sec('data/temp/sample_video.mp4', 10, 'data/temp/result_10sec.jpg')

In [11]:
def save_frame_range_sec(video_path, start_sec, stop_sec, step_sec,
                         dir_path, basename, ext='jpg'):
    cap = cv2.VideoCapture(video_path)
    
    if not cap.isOpened():
        return
    
    os.makedirs(dir_path, exist_ok=True)
    base_path = os.path.join(dir_path, basename)
    
    digit = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))))
    
    fps = cap.get(cv2.CAP_PROP_FPS)
    fps_inv = 1 / fps
    
    sec = start_sec
    while sec < stop_sec:
        n = round(fps * sec)
        cap.set(cv2.CAP_PROP_POS_FRAMES, n)
        ret, frame = cap.read()
        if ret:
            cv2.imwrite(
                '{}_{}_{:.2f}.{}'.format(
                    base_path, str(n).zfill(digit), n * fps_inv, ext
                ),
                frame
            )
        else:
            return
        sec += step_sec

In [12]:
save_frame_range_sec('data/temp/sample_video.mp4',
                     2, 10, 2,
                     'data/temp/result_range_sec', 'sample_video_img')