OpenCV 学习11 读取和写入视频文件

在 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()
相关推荐
厨 神1 小时前
opencv学习
人工智能·opencv·学习
柠檬07111 天前
opencv 未知函数记录-detailEnhance
人工智能·opencv·计算机视觉
子夜江寒1 天前
OpenCV图像处理部分基础操作
图像处理·python·opencv
柠檬07111 天前
opencv 未知函数记录-edgePreservingFilter
人工智能·opencv·计算机视觉
柠檬07111 天前
opencv 未知函数记录-findHomography
人工智能·opencv·计算机视觉
柠檬07111 天前
opencv 未知函数记录-estimateAffinePartial2D
人工智能·opencv·计算机视觉
WoY20201 天前
opencv-python在ubuntu系统中缺少依赖
python·opencv·ubuntu
TheLegendMe2 天前
AI infra5个月跳槽计划
opencv
Jerryhut2 天前
opencv总结9——答题卡识别
人工智能·opencv·计算机视觉