本文将通过几个核心示例,快速介绍如何使用 Python 的 OpenCV 库进行摄像头调用、视频文件读取以及视频录制与保存。
首先理解一个关键概念:帧。一帧就是一张静态图片。我们常说的 60 帧每秒(60 fps),即代表 1 秒钟内展示了 60 张连续的图片。
调用电脑摄像头
OpenCV 使用 VideoCapture 类来便捷地访问摄像头。通过调用 VideoCapture 对象的 read() 函数即可逐帧读取视频流数据。
read() 函数返回一个包含两个元素的元组 (flag, frame)。其中:
flag:一个布尔值(True/False),True 表示成功读取到一帧数据。
frame:读取到的图像数据(一个 NumPy 数组)。
计算机为每个摄像头设备分配了一个索引号。如果电脑只有一个摄像头,其索引通常为 0;若有多个,则依次编号为 0, 1, 2…
如何用代码打开摄像头读取数据呢?请看下面的完整示例:
import cv2
# 打开第一个摄像头(索引为0)
cap = cv2.VideoCapture(0)
# 循环读取数据
while True:
# 读取一帧数据,返回 标记和一帧数据。
# 读取到数据 flag=True,没读到数据 flag=False
flag, frame = cap.read()
# 如果没读到数据,则退出循环
if not flag:
break
# 显示读取到的这一帧图片
cv2.imshow("frame", frame)
# 设置播放帧率。例如30帧,表示1秒显示30张图片,每张图间隔约33毫秒 (1000//30)
key = cv2.waitKey(1000 // 30)
# 按下键盘上的 'q' 键,退出循环
if key == ord('q'):
break
# 释放摄像头资源并关闭所有OpenCV创建的窗口
cap.release()
cv2.destroyAllWindows()
这段代码是使用 OpenCV 进行计算机视觉处理的起点。运行后,你将看到一个实时显示摄像头画面的窗口。
读取本地视频文件
读取视频文件的操作与调用摄像头非常相似,同样是使用 VideoCapture 类,只需将参数从摄像头索引改为视频文件的路径即可。
import cv2
# 打开视频文件,传入文件路径
cap = cv2.VideoCapture("a.avi")
# 播放视频
while cap.isOpened():
flag, frame = cap.read()
if not flag:
break
cv2.imshow("read_video", frame)
key = cv2.waitKey(1000 // 30)
if key == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
录制并保存视频
想要保存视频或录制摄像头画面,就需要用到 VideoWriter 类。以下是其标准使用流程,你可以将其作为一个固定模板来记忆:
- 打开视频源:打开摄像头或视频文件。
- 指定编码格式:创建
VideoWriter_fourcc 对象,它定义了视频的压缩编码格式(如 ‘XVID’ 对应 .avi, ‘MP4V’ 对应 .mp4)。
- 创建写入器:实例化
VideoWriter 对象,指定输出文件名、编码器、帧率和视频尺寸。
- 循环读写:读取每一帧,并将其写入输出文件。
- 释放资源:操作完成后,释放所有相关对象。
这里是一个使用Python保存摄像头录制的示例代码:
import cv2
# 打开摄像头
cap = cv2.VideoCapture(0)
# 创建视频编码格式对象
# ‘XVID’:常用于 .avi 格式的视频文件。
# ‘MP4V’:常用于 .mp4 格式的视频文件。
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 创建VideoWriter对象
# 参数1: 保存的文件路径(后缀名必须与编码格式匹配,如.avi)
# 参数2: 视频编码格式对象
# 参数3: 帧率 (fps)
# 参数4: 视频画面的尺寸(必须与输入源的尺寸一致,可通过cap.get(3), cap.get(4)获取)
vw = cv2.VideoWriter('output.avi', fourcc, 30, (640, 480))
# 循环读取并写入数据
while cap.isOpened():
flag, frame = cap.read()
if not flag:
break
# 将当前帧写入到输出视频文件中
vw.write(frame)
# 可选:实时显示当前录制画面
cv2.imshow('save_video', frame)
# 控制播放/录制速度,帧率应与VideoWriter中设置的一致
key = cv2.waitKey(1000 // 30)
if key == ord('q'):
break
# 释放所有资源
cap.release()
vw.release()
cv2.destroyAllWindows()
程序运行后,你会在项目目录下找到新生成的 output.avi 文件。

希望以上示例能帮助你快速上手 OpenCV 的视频和摄像头操作。如果你在实践过程中遇到其他问题,或者想深入探讨计算机视觉的更多应用,欢迎来到云栈社区交流分享。