opencv: 合成视频

配置

Note :

  • 具体的fourcc配置一定要参照Saving a Video,否则编码时会出错:
    在这里插入图片描述
  • 如果生成的视频太小,大概率是因为 cv2.VideoWriter中的 图片大小 没有和 实际图片大小 对齐 。用cv2.imread获取图片shape仔细检查一下(有可能只是list中某一两张图片的shape不对,导致视频合成失败)。

补充:

实验证明,采用如下fourcc配置可以在mac上有效生成常用视频格式:

fourcc = cv2.VideoWriter_fourcc(*'avc1')

代码

# 用list记录图片地址
src_paths = [os.path.join(SRC_FOLDER, path) for path in os.listdir(SRC_FOLDER) if path.endswith(".png")]

# 一定要记得 sort() !
src_paths.sort()

# 配置cv2.VideoWriter参数
sample_img = cv2.imread(src_paths[0])
h, w, _ = sample_img.shape
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter(DST_FOLDER+video_name, fourcc, fps, (w, h))

# 循环write
pbar = tqdm(src_paths)
for i, src_path in enumerate(pbar):
    frame = cv2.imread(src_path)
    out.write(frame)
    # 实时显示处理过的帧图片
    cv2.imshow('frame', output)
    cv2.waitKey(1)
    pbar.set_description("  COMPLETE ")
    
# 释放cv2.VideoWriter
out.release()
# 关闭帧图片展示窗口
cv2.destroyAllWindows()

Test Code

import shutil
import cv2
from tqdm import tqdm


SRC_FOLDER = "./o_file/after_op_1"
DST_FOLDER = "./o_file/after_op_3"
ENDWITH = ".MOV"


def make_video(fps, video_name):

    src_paths = [os.path.join(SRC_FOLDER, path) for path in os.listdir(SRC_FOLDER) if path.endswith(".png")]
    src_paths.sort()
    
    sample_img = cv2.imread(src_paths[0])
    h, w, _ = sample_img.shape
	fourcc = cv2.VideoWriter_fourcc(*'DIVX')
	out = cv2.VideoWriter(DST_FOLDER+video_name, fourcc, fps, (w, h))
    
    pbar = tqdm(src_paths)
    for i, src_path in enumerate(pbar):
        frame = cv2.imread(src_path)
        out.write(frame)
        # 实时显示处理过的帧图片
        cv2.imshow('frame', output)
        cv2.waitKey(1)
        pbar.set_description("  COMPLETE ")
    out.release()
    # 关闭帧图片展示窗口
    cv2.destroyAllWindows()



if __name__ == "__main__":

    try:
        shutil.rmtree(DST_FOLDER)
    except OSError:
        pass
    import os
    os.makedirs(DST_FOLDER)

    fps_lst = [30]
    fourcc_types = [-1]

    for fps in fps_lst:
        video_name = "/output_" + "_" + str(fps) + ENDWITH
        print("\n Make video {} in fps:{}".format(video_name, fps))
        make_video(fps, video_name)

[1] OpenCV: Getting Started with Videos

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值