您的位置:

OpenCV 中的 VideoWriter 类

一、VideoWriter 类的介绍

VideoWriter 是 OpenCV 中用于将视频写入磁盘的类。它默认使用 XVID 编解码器和 AVI 格式保存视频,同时也支持其他格式的视频文件的保存。

VideoWriter 主要有以下几个参数:

  • filename:要保存的视频文件的路径及文件名。
  • fourcc:用于指定视频编解码器的 FourCC 代码。
  • fps:要保存的视频的帧率。
  • frameSize:要保存的视频的分辨率。
  • isColor:指定视频帧是否为彩色图像。

import cv2

# 创建 VideoWriter 对象
writer = cv2.VideoWriter("output.avi", cv2.VideoWriter_fourcc(*"XVID"), 30, (640, 480))

# 读取视频并将帧写入文件
cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    if not ret:
        break
    # 写入帧
    writer.write(frame)
    # 显示帧
    cv2.imshow("frame", frame)
    if cv2.waitKey(1) == ord("q"):
        break

# 释放对象
cap.release()
writer.release()
cv2.destroyAllWindows()

二、使用不同的编解码器

VideoWriter 默认使用 XVID 编解码器,但是如果系统没有安装该编解码器,则无法正确保存视频文件。因此,我们需要使用其他编解码器来保存视频。

下面是一个可以通过 FFMPEG 来保存视频的例子:


import subprocess as sp
import cv2

# 设置 FFMPEG 命令
FFMPEG_BIN = "ffmpeg"
command = [FFMPEG_BIN,
           '-y',  # 覆盖输出文件
           '-f', 'rawvideo',
           '-pix_fmt', 'bgr24',
           '-s', '640x480',
           '-r', '25',
           '-i', '-',
           '-an',
           '-vcodec', 'mpeg4',
           'output.avi']

# 打开 FFMPEG 进程
pipe = sp.Popen(command, stdin=sp.PIPE)

# 读取视频并将帧写入文件
cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    if not ret:
        break
    # 写入帧
    pipe.stdin.write(frame.tostring())
    # 显示帧
    cv2.imshow("frame", frame)
    if cv2.waitKey(1) == ord("q"):
        break

# 关闭 FFMPEG 进程
pipe.stdin.close()
pipe.wait()

# 释放对象
cap.release()
cv2.destroyAllWindows()

三、调整视频帧的大小和帧率

在某些情况下,保存视频时需要将视频帧的大小和帧率进行调整,这需要使用 resize() 和 cv2.CAP_PROP_FPS 属性。下面的代码按照每秒 10 帧,将输入的图像的大小调整为 320x240,输出的视频的帧率为 30 帧每秒。


import cv2

# 创建 VideoWriter 对象
writer = cv2.VideoWriter("output.avi", cv2.VideoWriter_fourcc(*"XVID"), 30, (320, 240))

# 读取视频并将帧写入文件
cap = cv2.VideoCapture(0)
frame_count = 0
while True:
    ret, frame = cap.read()
    if not ret:
        break
    # 调整帧大小
    frame = cv2.resize(frame, (320, 240))
    # 写入帧
    writer.write(frame)
    # 显示帧
    cv2.imshow("frame", frame)
    if cv2.waitKey(1) == ord("q"):
        break
    # 调整帧率
    frame_count += 1
    if frame_count % 3 == 0:
        cap.set(cv2.CAP_PROP_POS_FRAMES, frame_count + 1)

# 释放对象
cap.release()
writer.release()
cv2.destroyAllWindows()

四、保存为其他视频格式

VideoWriter 默认使用 AVI 格式保存视频,但是可以通过更改 fourcc 来保存为其他格式的视频文件。


import cv2

# 创建 VideoWriter 对象
writer = cv2.VideoWriter("output.mkv", cv2.VideoWriter_fourcc(*"X264"), 30, (640, 480))

# 读取视频并将帧写入文件
cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    if not ret:
        break
    # 写入帧
    writer.write(frame)
    # 显示帧
    cv2.imshow("frame", frame)
    if cv2.waitKey(1) == ord("q"):
        break

# 释放对象
cap.release()
writer.release()
cv2.destroyAllWindows()