python实现视频抽帧成图片、图片转成视频、图片转成GIF图

一、将视频抽帧成图片

【注】需要改动的只有三个变量video_path,ims_folder,target_num。其中target_num表示希望从视频中等间隔的采样出多少帧,如果你希望提取所有帧就不用在意这个参数,而改动代码中被注释掉的部分(默认是抽取所有帧)

video_path:表示待处理视频的路径
ims_folder:表示抽出的帧存放的文件夹`

import os
import cv2

def extract_frames(video_path, dst_folder, index, frame_num):
    video = cv2.VideoCapture()
    if not video.open(video_path):
        print("can not open the video")
        exit(1)
    count = 0
    frames_num = video.get(7)
    # step = int(frames_num/frame_num) #if you want to gap
    step = 1
    while True:
        _, frame = video.read()
        if frame is None:
            break
        if count % step == 0:
            save_path = "{}/{:>04d}.png".format(dst_folder, index)
            cv2.imwrite(save_path, frame)
            index += 1
        count += 1
        if (index==frames_num):
        # if (index==frame_num): #if you want to gap
            break
    video.release()

if __name__ == '__main__':
    video_path = './check.mp4'
    ims_folder = './frames'
    if not os.path.exists(ims_folder):
        os.makedirs(ims_folder)
    index = 0
    target_num = 16
    extract_frames(video_path, ims_folder, index ,target_num)

二、将图片组合成视频

ims_folder:待处理的图片文件夹
video_path:输出视频的路径

import os
from PIL import Image
import cv2

if __name__ == '__main__':
    ims_folder = './frames'
    video_path = './out_video.mp4'

    ims_path_list = os.listdir(ims_folder)
    ims_path_list.sort()
    fps = 30
    im_path = os.path.join(ims_folder, ims_path_list[0])
    im_size = Image.open(os.path.join(ims_folder, ims_path_list[0])).size
    fourcc = cv2.VideoWriter_fourcc(*"MJPG")
    videoWriter = cv2.VideoWriter(video_path, fourcc, fps, im_size)

    for i, im_path in enumerate(ims_path_list):
        im_path = os.path.join(ims_folder, im_path)
        frame = cv2.imread(im_path)
        videoWriter.write(frame)
        print(im_path)
    videoWriter.release()
    print('finish')

三、图片转成GIF图

ims_folder:待处理的图片文件夹
gif_path:输出GIF图的路径

import os
import imageio

if __name__ == '__main__':
    ims_folder = './frames'
    gif_path = './episode.gif'
    ims_path_list = os.listdir(ims_folder)
    ims_path_list.sort()
    ims_list = []

    for i, im_path in enumerate(ims_path_list):
        im = imageio.imread(os.path.join(ims_folder, im_path))
        ims_list.append(im)
    imageio.mimsave(gif_path, ims_list, duration=0.4, loop=1)

版权声明:本文为weixin_42544131原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。