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()
相关推荐
unity工具人2 小时前
python+yolov8 图像识别-测试案例
python·opencv·yolo
CV-deeplearning4 小时前
NVIDIA CV-CUDA:GPU 全流程加速计算机视觉,pip 一键安装替代 OpenCV,微软/腾讯/百度/字节全在用,云级图像处理吞吐量飙升 10 倍
opencv·计算机视觉·pip·nvidia·cuda·gpu加速·cv-cuda
Together_CZ4 小时前
OpenCV 5.0 重磅发布:全面技术深度解析
图像处理·人工智能·opencv·计算机视觉·llm·dnn·推理
2401_885665194 小时前
从神经元到BP反向传播,零基础吃透神经网络底层原理
人工智能·python·深度学习·神经网络·opencv
闻道且行之5 小时前
Hair Segmentation:MediaPipe 头发分割模块 CMake 独立编译
c++·人工智能·深度学习·神经网络·opencv·计算机视觉
天天代码码天天5 小时前
用 OpenCV 5 DNN 跑 PP-OCR:一个适合新手学习的 C++ 动态库 + C# 可视化测试项目
opencv·ocr·dnn·opencv5·ppocrv6
_李小白2 天前
【android opencv学习笔记】Day 32:直线检测之霍夫变换
android·opencv·学习
程序员正茂2 天前
EasyAR使用OpenCV下USB摄像头作为自定义相机
opencv·unity·easyar
_李小白2 天前
【android opencv学习笔记】Day 31:提取轮廓之Canny算法
android·opencv·学习
点云兔子2 天前
舱口检测:从点云到矩形定位的射线投影算法
opencv·算法·点云·舱口检测