第4章 摄像头视频流读取

cv2.VideoCapture · 帧率控制 · 实时显示 04 / 30

本章将深入 OpenCV 中最核心的实时视频模块:cv2.VideoCapture。从打开摄像头、控制帧率到实时渲染每一帧,是构建一切视觉应用的基础。

摄像头 VideoCapture 帧率控制 显示

1. cv2.VideoCapture 基础

VideoCapture 支持摄像头索引(0,1,…)或视频文件路径。常用方法:

  • cap = cv2.VideoCapture(0) —— 打开默认摄像头
  • cap.isOpened() —— 检查是否成功打开
  • ret, frame = cap.read() —— 读取一帧,ret 为布尔值
  • cap.release() —— 释放资源
cap.read() ret (bool) frame (ndarray)

2. 帧率控制与时间戳

通过 cap.get(cv2.CAP_PROP_FPS) 获取摄像头标称帧率。实际显示时常用 time.sleep 或 cv2.waitKey 控制循环速度。

属性含义示例值
CAP_PROP_FPS帧率 (FPS)30.0
CAP_PROP_FRAME_WIDTH宽度640
CAP_PROP_FRAME_HEIGHT高度480
CAP_PROP_POS_MSEC当前时间戳 (ms)1024.5
读取帧 waitKey(delay) 显示/处理

3. 实时显示与循环

使用 cv2.imshow 显示帧,配合 cv2.waitKey(1) 实现刷新。典型循环结构:

import cv2

cap = cv2.VideoCapture(0)
if not cap.isOpened():
    print("无法打开摄像头")
    exit()

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 在这里进行帧处理(可选)
    cv2.imshow('Camera Stream', frame)

    # 按 'q' 键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
cap.read() imshow() waitKey(1)

4. 测量并显示 FPS

利用 time.time() 计算实际帧率,并在窗口标题或帧上显示。

import cv2, time

cap = cv2.VideoCapture(0)
prev_time = time.time()

while True:
    ret, frame = cap.read()
    if not ret:
        break

    curr_time = time.time()
    fps = 1 / (curr_time - prev_time)
    prev_time = curr_time

    cv2.putText(frame, f"FPS: {fps:.1f}", (10, 40),
                cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    cv2.imshow('FPS Monitor', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

5. 实时视频流软件架构

VideoCapture 帧率控制 处理/分析 显示 循环反馈 (read → process → show)