第4章 摄像头视频流读取
cv2.VideoCapture · 帧率控制 · 实时显示
04 / 30
本章将深入 OpenCV 中最核心的实时视频模块:cv2.VideoCapture。从打开摄像头、控制帧率到实时渲染每一帧,是构建一切视觉应用的基础。
1. cv2.VideoCapture 基础
VideoCapture 支持摄像头索引(0,1,…)或视频文件路径。常用方法:
cap = cv2.VideoCapture(0)—— 打开默认摄像头cap.isOpened()—— 检查是否成功打开ret, frame = cap.read()—— 读取一帧,ret 为布尔值cap.release()—— 释放资源
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 |
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()
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()