OpenCV 视频采集(VideoCapture)超详细用法教程

OpenCV 视频采集(VideoCapture)超详细用法教程

这三个函数是 OpenCV 视频采集的核心三件套VideoCapture()初始化、cap.read()逐帧读取、cap.release()释放资源。下面从原理、参数、示例到避坑,给你讲透每一步。


一、核心函数全解析

1.cv2.VideoCapture():初始化视频/摄像头

作用:创建视频捕获对象,用于打开摄像头、读取本地视频文件、网络流等。

完整语法
cv2.VideoCapture(index,apiPreference=cv2.CAP_ANY)# 或cv2.VideoCapture(filename,apiPreference=cv2.CAP_ANY)
参数说明
参数说明常用值
index(摄像头)设备索引,0 代表默认摄像头(笔记本自带),1 代表外接摄像头,以此类推0(最常用)、12
filename(视频/流)本地视频路径(如test.mp4)、网络流地址(如 RTSP/RTMP)、图片序列'test.mp4''rtsp://xxx'
apiPreference后端API,指定视频捕获的驱动,解决兼容性问题cv2.CAP_ANY(自动)、cv2.CAP_DSHOW(Windows推荐)、cv2.CAP_FFMPEG
关键属性(初始化后可设置/获取)
cap=cv2.VideoCapture(0,cv2.CAP_DSHOW)# Windows下用DSHOW更稳定# 获取摄像头参数print("帧率:",cap.get(cv2.CAP_PROP_FPS))print("分辨率宽:",cap.get(cv2.CAP_PROP_FRAME_WIDTH))print("分辨率高:",cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 设置摄像头参数(部分摄像头支持)cap.set(cv2.CAP_PROP_FRAME_WIDTH,1280)# 设宽度cap.set(cv2.CAP_PROP_FRAME_HEIGHT,720)# 设高度cap.set(cv2.CAP_PROP_FPS,30)# 设帧率

2.cap.read():逐帧读取视频/摄像头画面

作用:从捕获对象中读取一帧图像,是视频采集的核心循环。

完整语法
ret,frame=cap.read()
返回值说明
返回值说明
ret布尔值,True表示读取成功,False表示读取失败(视频结束/摄像头断开)
frame读取到的帧(numpy数组,BGR格式,和imread结果一致),失败时为None
核心用法

视频采集必须用循环读取,因为视频是由连续帧组成的:

whileTrue:ret,frame=cap.read()ifnotret:# 读取失败,退出循环break# 对frame进行处理(显示、保存、算法处理等)cv2.imshow("frame",frame)# 按q退出(必须加,否则窗口卡死)ifcv2.waitKey(1)&0xFF==ord('q'):break

3.cap.release():释放资源

作用:关闭视频捕获对象,释放摄像头/文件句柄,避免资源占用。

语法
cap.release()
配套操作

释放后必须销毁所有OpenCV窗口,否则程序可能残留进程:

cv2.destroyAllWindows()

二、实战:3个核心场景完整代码

场景1:打开笔记本摄像头,实时显示(最常用)

importcv2# 1. 初始化摄像头(0=默认摄像头,Windows加cv2.CAP_DSHOW更稳定)cap=cv2.VideoCapture(0,cv2.CAP_DSHOW)# 2. 检查摄像头是否成功打开ifnotcap.isOpened():print("错误:无法打开摄像头!")exit()# 3. 创建窗口并设置标题(使用英文避免乱码)window_name="Camera Live Feed"# 使用英文标题cv2.namedWindow(window_name,cv2.WINDOW_NORMAL)# WINDOW_NORMAL允许调整窗口大小# 可选:设置窗口大小cv2.resizeWindow(window_name,640,480)# 4. 循环读取帧whileTrue:# 读取一帧ret,frame=cap.read()ifnotret:print("无法读取帧,退出...")break# 显示帧cv2.imshow(window_name,frame)# 按q键退出(waitKey(1)是1ms延时,必须加,否则窗口无响应)ifcv2.waitKey(1)&0xFF==ord('q'):break# 4. 释放资源cap.release()cv2.destroyAllWindows()

场景2:读取本地视频文件,逐帧播放

importcv2# 1. 打开本地视频(注意路径中的反斜杠需要转义或使用原始字符串)cap=cv2.VideoCapture(r"D:\Video_2026-04-03_105512.wmv")# 使用r前缀避免转义问题# 2. 检查是否成功打开ifnotcap.isOpened():print("错误:无法打开视频文件!")exit