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

一、图片转视频

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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值