图片和视频的相互转换、文件夹下的图片重新命名、视频拼接

一、图片转视频

def image2video():
    img_root = "./image/"          #保存的图片路径
    fps = 25    # 保存视频的FPS,可以适当调整
    # size=(1920, 1080)   #源图片尺寸
    size = (1280,480)      #和源图片大小一样,否则会报错
    fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')    #保存的视频格式
    # fourcc = cv2.VideoWriter_fourcc(*'XVID')
    videoWriter = cv2.VideoWriter("./video.mp4", fourcc, fps, size)   # 最后一个是保存图片的尺寸
    images_list = sorted([os.path.join(img_root, file) for file in os.listdir(img_root) if file.endswith('.png')])        #将目录下的图片按名字由小到大排序,等下按顺序写入视频,所以图片要用数字命名
    print(len(images_list))
    for i in range(0, len(images_list)):         #循环处理每一张图片
        frame = cv2.imread(img_root + str(i) + '.png')
        videoWriter.write(frame)
        if i == len(images_list):
            videoWriter.release()
            cv2.destroyAllWindows()
            break
        print("frame number = ",i)
    videoWriter.release()

二、视频转图片

def video2image():
    image_dir = "./image/"         #要保存的图片路径
    images_list = sorted([os.path.join(image_dir, file) for file in os.listdir(image_dir) if file.endswith('.png')])           
    print(len(images_list))

    cap = cv2.VideoCapture("./video.mp4")         #需要转换成图片的视频路径
    video_frames = int(cap.get(7))                #计算视频总帧数
    print(video_frames)
    start_cut_frame = 0                           #从第几帧开始保存               
    cap.set(cv2.CAP_PROP_POS_FRAMES,start_cut_frame)       #设置从第几帧开始保存  

    i = 0
    j = len(images_list)                 #获取图片文件目录下有多少张图片,以便下次在这个文件目录下保存图片时不会覆盖掉原来已经保存的图片,而是接着图片数量往下用数字命名
    while i < video_frames-1:
        ret, frame = cap.read()
        if i % 1 == 0:                                  #通过改变取多少余可以获得间隔多少帧保存图片
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            img = Image.fromarray(frame)         
            # img = img.resize((480, 360), Image.BILINEAR)
            # img_name = image_dir + str(j).zfill(5) + ".png"
            print("frame number = ",i)
            img_name = image_dir + str(j) + ".png"      
            j = j + 1
            print(img_name)
            img.save(img_name)
            # if i >= 6659:                       #设置从第几帧开始保存,上面的程序从视频的第一帧开始保存
            #     img_name = image_dir + str(j) + ".png"
            #     j = j + 1
            #     print(img_name)
            #     img.save(img_name)

            if cv2.waitKey(1) & 0xFF == ord('q') or i == 200000:    #可以设置i的值来设置保存到第几帧的视频
                break
        i = i + 1
    cap.release()

三、图片重命名

def rename_file():                 #将图片按顺序命名,如:1.png、2.png、3.png 。。。
    image_dir = "./image/"
    file_1 = [int(file[:-4]) for file in os.listdir(image_dir) if file[-4:] == '.png']
    file_2 = sorted(file_1)
    i = 0                 #设置从几开始命名
    for file in file_2:
        newname = str(i) + ".png"
        i +=1
        os.rename(os.path.join(image_dir,str(file) + ".png"),os.path.join(image_dir,newname))

以上程序的运行需要导入这些库

import copy
import cv2
import os
from PIL import Image

四、视频拼接

# 主要是需要moviepy这个库
from moviepy.editor import *
import os

# 定义一个数组,保存要拼接的视频名称
L = []              

# 访问 video 文件夹 (假设视频都放在这里面)
for root, dirs, files in os.walk("./Video/"):       #"./Video/"目录下保存要拼接的视频,根据要拼接视频的前后顺序,将视频按数字大小命名,比如:1.mp4、2.mp4 。。。
    # 按文件名排序
    files.sort()
    # 遍历所有文件
    for file in files:
        # 如果后缀名为 .mp4
        if os.path.splitext(file)[1] == '.mp4':
            # 拼接成完整路径
            filePath = os.path.join(root, file)
            # 载入视频
            video = VideoFileClip(filePath)
            # 添加到数组
            L.append(video)

# 拼接视频
final_clip = concatenate_videoclips(L)
# 生成目标视频文件
final_clip.to_videofile("./dstVideo.mp4", fps=25, remove_temp=False)

你可能感兴趣的:(图片和视频的相互转换、文件夹下的图片重新命名、视频拼接)