在 OpenCV 中,VideoCapture 和 VideoWriter 是两个用于处理视频输入和输出的核心类,支持各种视频文件格式。
1、VideoCapture
用于读取视频文件或捕获摄像头实时画面。
1.1 构造函数
python
cap = cv2.VideoCapture(device_index or filename, apiPreference=None)
- 参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| device_index | int | 摄像头设备索引(如 0, 1 表示第一个、第二个摄像头) |
| filename | str | 视频文件路径 |
| apiPreference | int(可选) | 指定后端 API Windows DirectShow:cv2.CAP_DSHOW () Windows Media Foundation:cv2.CAP_MSMF FFMPEG后端:cv2.CAP_FFMPEG ... |
1.2 主要方法
| 方法 | 说明 |
|---|---|
| read | 读取一帧 |
| isOpened | 检查VideoCapture对象是否成功打开 |
| release | 释放资源 |
| get(propId) | 获取视频属性值 |
| set(propId, value) | 设置属性 |
- 常用属性
| 属性常量 | 说明 |
|---|---|
| cv2.CAP_PROP_FRAME_WIDTH | 帧宽度 |
| cv2.CAP_PROP_FRAME_HEIGHT | 帧高度 |
| cv2.CAP_PROP_FPS | 帧率 |
| cv2.CAP_PROP_FOURCC | 编码格式 |
| cv2.CAP_PROP_FRAME_COUNT | 总帧数 |
| cv2.CAP_PROP_BRIGHTNESS | 亮度 |
| ... | 请查手册 |
1.3 代码示例
示例代码功能:打开摄像头、读取视频流,显示图像和视频属性、按q退出
python
import cv2
# 创建 VideoCapture 对象,0 表示默认摄像头
cap = cv2.VideoCapture(0)
# 检查摄像头是否成功打开
if not cap.isOpened():
print("无法打开摄像头")
exit()
while True:
# 读取一帧图像
ret, frame = cap.read()
if not ret:
print("无法读取视频流")
break
# 获取视频属性
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
# 在图像上添加文字信息
info_text = [
f"Resolution: {width}x{height}",
f"FPS: {fps:.1f}"
]
# 设置字体参数
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 0.7
color = (0, 255, 0) # 绿色
thickness = 2
line_type = cv2.LINE_AA
# 在图像上逐行添加信息
y_offset = 30
for i, text in enumerate(info_text):
cv2.putText(frame, text, (10, y_offset + i * 30),
font, font_scale, color, thickness, line_type)
# 显示图像
cv2.imshow('Camera', frame)
# 按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
2、VideoWriter
用于将图像帧写入视频文件,相关定义及方法请查手册。
- 常见 FourCC 编码
| 编码字符串 | 说明 |
|---|---|
| XVID | 广泛兼容的AVI编码,.avi |
| MJPG | Motion-JPEG,质量较高但文件大,.avi |
| H264 | H.264 编码,压缩率高,.mp4 |
| MP4V | MP4 视频编码,.mp4 |
示例代码功能:打开摄像头、读取视频流,显示图像并保存到文件、按q退出
python
import cv2
# 打开摄像头
cap = cv2.VideoCapture(0)
# 检查摄像头是否成功打开
if not cap.isOpened():
print("无法打开摄像头")
exit()
# 获取摄像头的帧宽和帧高
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
# 定义编码格式并创建 VideoWriter 对象
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 编码器
# 等同于下面的写法
# fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
out = cv2.VideoWriter('camera.avi', fourcc, fps, (frame_width, frame_height))
# 检查 VideoWriter 是否成功创建
if not out.isOpened():
print("创建 VideoWriter 失败")
cap.release()
exit()
print("开始录制视频... 按 'q' 键停止并保存")
# 循环读取摄像头帧
while True:
ret, frame = cap.read()
if not ret:
print("无法读取摄像头帧")
break
# 显示当前帧
cv2.imshow('Camera', frame)
# 写入帧到视频文件
out.write(frame)
# 按 q 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
print("停止录制,正在保存...")
break
# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()