一、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()