配置
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)