1.主要利用OpenCV中cv2.VideoWriter_fourcc()函数合成视频

     1.1VideoWriter_fourcc()常见的编码参数
cv2.VideoWriter_fourcc('M', 'P', '4', 'V')MPEG-4编码 .mp4 可指定结果视频的大小
cv2.VideoWriter_fourcc('X','2','6','4')MPEG-4编码 .mp4 可指定结果视频的大小
cv2.VideoWriter_fourcc('I', '4', '2', '0')该参数是YUV编码类型,文件名后缀为.avi 
cv2.VideoWriter_fourcc('P', 'I', 'M', 'I')该参数是MPEG-1编码类型,文件名后缀为.avi
cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')该参数是MPEG-4编码类型,文件名后缀为.avi,可指定结果视频的大小
cv2.VideoWriter_fourcc('T', 'H', 'E', 'O')该参数是Ogg Vorbis,文件名后缀为.ogv
cv2.VideoWriter_fourcc('F', 'L', 'V', '1')该参数是Flash视频,文件名后缀为.flv

此处参照博主

2.代码

将某个文件夹中的所有图片,合成为一个视频。

import cv2
import os
from natsort import natsorted

# jpg2mp4
def merge_image_to_video(folder_name,output_format):

    output_folder = "G:/Germany/Photo/G222Ptest/mp"
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    fps = 120
    file_list = natsorted(os.listdir(folder_name), key=lambda y: y.lower())   # 使用natsorted进行自然排序
    total_files = len(file_list)

    video = None  # 初始化视频写入器
    frame_index = 0 #初始化索引

    for idx, f1 in enumerate(file_list):
        filename = os.path.join(folder_name, f1)
        print(f"当前位置{filename}")

        frame = cv2.imread(filename)
        if frame is None:  # 检查为空
            print(f"无法读取图片:{filename},跳过该图片")
            continue
        #奇技淫巧(%n按照n间隔生成)
        if frame_index % 1 !=0:
            frame_index +=1
            continue
        
        # 将图像转换为彩色图像
        #color_frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)  原图不需要转换

        if video is None or not video.isOpened():  # 如果视频写入器未初始化,则进行初始化
            first_frame = cv2.imread(filename)
            img_size = (first_frame.shape[1], first_frame.shape[0])
            # fourcc = cv2.VideoWriter_fourcc(*'FLV1')   #mp4v/mp4   XVID/avi   FLV1/flv  修改编码格式
            # output_path = os.path.join(output_folder, "output.flv")
            
            if output_format == 'mp4':
                fourcc = cv2.VideoWriter_fourcc(*'mp4v')
            elif output_format == 'avi':
                fourcc = cv2.VideoWriter_fourcc(*'XVID')
            elif output_format =='flv':
                fourcc = cv2.VideoWriter_fourcc(*'FLV1')
            elif output_format =='ogv':
                fourcc = cv2.VideoWriter_fourcc(*'THEO')
            else:
                print("不支持的视频格式,自行添加")
                return
            output_path = os.path.join(output_folder, f"output.{output_format}")

            video = cv2.VideoWriter(output_path, fourcc, fps, img_size, isColor=True)

        video.write(frame) #color_frame   
        print(f"进度: {idx+1}/{total_files}")
        frame_index +=1

    if video is not None and video.isOpened():  # 确保视频写入器已打开
        video.release()  # 释放视频写入器
        print("视频已成功生成")
    else:
        print("视频生成失败,查看文件路径")

if __name__ == '__main__':
    folder_name = r"G:/Germany/Photo/G222Ptest"
    merge_image_to_video(folder_name,output_format='avi')

3.参数略述


filename 是要保存的文件的路径        folder_name为待合成图片文件夹
fourcc 指定编码器,切换不同格式        output_format为转换格式
fps 要保存的视频的帧率                     frameSize 要保存的文件的画面尺寸,
isColor 指示是黑白画面还是彩色的画面

fps:可指定大小合成高刷帧,frame_index抽帧合成,略有不同

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐