- 核心推荐:OpenCV (
cv2) - 这是你应该首先学习的库。 - 其他重要库 - 了解 OpenCV 的替代品和补充。
- 一个完整的项目示例 - 结合摄像头和视频文件进行实时处理。
- 常见问题与最佳实践 - 帮助你避开坑。
核心推荐:OpenCV (cv2)
OpenCV (Open Source Computer Vision Library) 是一个功能极其强大的计算机视觉和机器学习软件库,它的 VideoCapture 模块是进行视频捕获的利器。

安装
你需要安装 OpenCV,在终端或命令行中运行:
pip install opencv-python
为了支持更多视频格式(如 MP4),你可能还需要安装 opencv-contrib-python:
pip install opencv-contrib-python
基本用法
cv2.VideoCapture 是核心类,它可以从摄像头或视频文件中捕获视频。
A. 从摄像头捕获
这是最常见的用法,比如打开笔记本的内置摄像头或连接的 USB 摄像头。

import cv2
# 0 通常是默认的摄像头ID,如果有多个摄像头,可以尝试 1, 2, ...
cap = cv2.VideoCapture(0)
# 检查摄像头是否成功打开
if not cap.isOpened():
print("无法打开摄像头")
exit()
while True:
# `ret` 是一个布尔值,如果成功读取到帧,则为 True
# `frame` 是当前捕获到的图像帧 (一个 NumPy 数组)
ret, frame = cap.read()
# 如果没有读取到帧,说明视频结束或出错
if not ret:
print("无法获取帧 (流结束?),正在退出...")
break
# 显示捕获到的帧
cv2.imshow('Camera Feed', frame)
# 等待按键,如果按下 'q' 键,则退出循环
# cv2.waitKey(1) 会等待 1 毫秒
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头资源
cap.release()
# 关闭所有由 OpenCV 创建的窗口
cv2.destroyAllWindows()
B. 从视频文件捕获
这个过程和从摄像头捕获几乎完全一样,只需要把 0 换成视频文件的路径。
import cv2
# 替换 'my_video.mp4' 为你的视频文件路径
video_path = 'my_video.mp4'
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
print(f"无法打开视频文件: {video_path}")
exit()
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("视频播放完毕或读取失败。")
break
# 显示视频帧
cv2.imshow('Video Playback', frame)
# 控制播放速度 (每 25 毫秒刷新一帧)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
VideoCapture 的常用方法和属性
| 方法/属性 | 描述 |
|---|---|
cap.read() |
读取下一帧,返回一个元组 (ret, frame)。ret 是布尔值,frame 是图像数据。 |
cap.get(propId) |
获取视频的属性。propId 可以是整数或 cv2.CAP_PROP_* 枚举。 |
cap.set(propId, value) |
设置视频的属性。 |
cap.isOpened() |
检查 VideoCapture 对象是否已成功初始化并准备好读取。 |
cap.release() |
关闭视频文件或释放摄像头。 |
cv2.destroyAllWindows() |
关闭所有 OpenCV 创建的窗口。 |
常用属性 (propId) 示例:
cap = cv2.VideoCapture(0)
# 获取视频的宽度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
# 获取视频的高度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 获取帧率 (FPS)
fps = cap.get(cv2.CAP_PROP_FPS)
# 获取总帧数 (对视频文件有效)
frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT)
print(f"宽度: {width}, 高度: {height}, FPS: {fps}, 总帧数: {frame_count}")
cap.release()
其他重要库
虽然 OpenCV 是首选,但在某些特定场景下,其他库可能更合适。
A. PyAV
- 简介:一个基于
libav(FFmpeg 的核心库) 的 Python 绑定,FFmpeg 是处理音视频的“瑞士军刀”。 - 优点:
- 性能极高:直接调用底层库,处理速度非常快,适合高性能视频处理和分析。
- 格式支持极好:支持几乎所有你能想到的视频格式和编解码器。
- 更底层的控制:可以精细地控制视频流的各个方面。
- 缺点:
- API 相对复杂:学习曲线比 OpenCV 陡峭。
- 依赖:需要安装 FFmpeg。
- 适用场景:需要处理大量视频流、进行复杂视频转码、分析或编解码的深度学习项目。
B. imageio
- 简介:一个用于读取和写入多种图像和视频格式的库。
- 优点:
- API 简单易用:
imageio.get_reader()和imageio.get_writer()非常直观。 - 依赖少:安装和配置相对简单。
- API 简单易用:
- 缺点:
- 功能不如 OpenCV 丰富:专注于 I/O,内置的计算机视觉功能较少。
- 适用场景:快速读取视频文件中的帧,或者将一系列图像保存为视频,而不需要复杂的图像处理。
imageio 示例:

import imageio
# 读取视频
reader = imageio.get_reader('my_video.mp4')
for i, im in enumerate(reader):
if i % 10 == 0: # 每10帧显示一次
# im 是一个 NumPy 数组,可以直接用 Matplotlib 显示
import matplotlib.pyplot as plt
plt.imshow(im)
plt.show()
# 写入视频
writer = imageio.get_writer('output.mp4', fps=20)
for i in range(100):
# 创建一个简单的帧 (这里用随机数代替)
frame = (imageio.core.util.Array(np.random.rand(100, 100, 3) * 255, dtype='uint8'))
writer.append_data(frame)
writer.close()
C. SimpleCV
- 简介:一个旨在简化计算机视觉任务的库,基于 OpenCV 和其他库构建。
- 优点:
- 非常简洁的 API:封装了 OpenCV 的复杂性,让代码更易读。
- 适合初学者:可以快速实现一些基础功能,如颜色追踪、特征检测等。
- 缺点:
- 项目更新较慢:不如 OpenCV 活跃。
- 灵活性较低:封装过度,难以进行高度定制化的底层操作。
- 适用场景:教育、快速原型验证、简单的计算机视觉应用。
完整项目示例:实时人脸检测
这个项目将结合摄像头捕获和 OpenCV 的级联分类器,实现一个实时的人脸检测器。
步骤:
-
安装库:
pip install opencv-python
-
下载人脸检测模型: 访问 OpenCV 的 GitHub 仓库,下载
haarcascade_frontalface_default.xml文件,并将其放在你的 Python 脚本同目录下。 -
编写代码 (
face_detector.py):
import cv2
# 1. 加载人脸检测的级联分类器
# 确保 'haarcascade_frontalface_default.xml' 文件在脚本同目录下
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 2. 打开默认摄像头
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("无法打开摄像头")
exit()
print("人脸检测器已启动,按 'q' 键退出。")
while True:
# 3. 读取一帧
ret, frame = cap.read()
if not ret:
break
# 4. 将图像转换为灰度图,因为人脸检测在灰度图上效果更好且 