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()
相关推荐
SunnyDays101111 小时前
如何使用 C# 转换 PowerPoint 为 HTML:完整指南
人工智能·opencv·计算机视觉·c#
_李小白1 天前
【android opencv学习笔记】Day 8: remap(像素位置重映射)
android·opencv·学习
xp_fangfei1 天前
通过 Marker(视觉标记)获取机器人位姿
opencv·机器人
Lhan.zzZ1 天前
笔记_2026.4.28_003
c++·笔记·qt·opencv
sali-tec1 天前
C# 基于OpenCv的视觉工作流-章56-OCR
图像处理·人工智能·opencv·算法·计算机视觉·ocr
_李小白2 天前
【android opencv学习笔记】Day 2: Mat类(图片数据结构体)
android·opencv·学习
Leon_Chenl2 天前
【已开源】【嵌入式 Linux 音视频+ AI 实战项目】瑞芯微 Rockchip 系列 RK3588-基于深度学习的人脸门禁+ IPC 智能安防监控系统
深度学习·opencv·yolo·ffmpeg·音视频·边缘计算·人脸识别+检测
H Journey2 天前
常用知识总结C++、CMake、Linux
linux·c++·opencv·cmake
sali-tec4 天前
C# 基于OpenCv的视觉工作流-章53-QR二维码1
图像处理·人工智能·opencv·算法·计算机视觉
星辰徐哥4 天前
OpenCV入门:Windows系统下OpenCV的安装与环境配置
人工智能·windows·opencv