1 图像写入视频

1.1 代码

import numpy as np
import cv2 as cv

def image_to_video(img_dir, video_file):
    files = os.listdir(img_dir)
    # 定义编解码器并创建VideoWriter对象
	fourcc = cv.VideoWriter_fourcc(*'XVID')
	fps = 20.0
	out = cv.VideoWriter('output.avi', fourcc, fps, (img.shape[1], img.shape[0]))
 
    for ff in files:
        img = cv2.imread(os.path.join(img_dir, ff))
        vid.write(img)

	# 完成工作后释放
	out.release()

1.2 VideoWriter_fourcc常见编码参数

参数列表说明视频格式
cv2.VideoWriter_fourcc(‘X’,‘2’,‘6’,‘4’)MPEG-4编码 .mp4 想限制结果视频的大小,这可能是最好的选择。.mp4
cv2.VideoWriter_fourcc(‘M’, ‘P’, ‘4’, ‘V’)相对较旧的MPEG-4编码。如果要限制结果视频的大小,这是一个很好的选择。.m4v
cv2.VideoWriter_fourcc(‘P’, ‘I’, ‘M’, ‘I’)MPEG-1编码类型,随机访问,灵活的帧率、可变的图像尺寸.avi
cv2.VideoWriter_fourcc(‘X’,‘V’,‘I’,‘D’)MPEG-4编码类型,对运动物体可以保证有良好的清晰度,时间/画质具有可调性。.avi
cv2.VideoWriter_fourcc(‘I’,‘4’,‘2’,‘0’)YUV编码类型,4:2:0色度子采样。兼容性好,但会产生大文件.avi
cv2.VideoWriter_fourcc(‘T’, ‘H’, ‘E’, ‘O’)参数是Ogg Vorbis,音频压缩格式,有损压缩,类似于MP3等的音乐格式.ogv
cv2.VideoWriter_fourcc(‘F’, ‘L’, ‘V’, ‘1’)参数是Flash视频,形成的文件极小、加载速度极快.flv

2. 问题排查

2.1 检查VideoWriter的长宽

  • 如果是直接定义的长宽
    要确定输入图像的长宽和VideoWriter中对象的长宽是否一致。
  • 如果是读取图片后设定长宽
    要注意cv2读取之后的长宽和VideoWriter中是相反的,所以需要:
img = cv2.imread(os.path.join(img_dir, files[0]))
vid = cv2.VideoWriter(video_file, fourcc, fps, (img.shape[1], img.shape[0]))

2.2 检查图像的通道

VideoWriter不适用于单通道灰度图,所以如果想要正常写入,需要把灰度图转为三通道,再写入:

img2 = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐