Python OpenCV 摄像头调用与视频流处理实战指南
本文详解如何使用 Python 和 OpenCV 调用摄像头、录制视频及处理视频流。内容涵盖 VideoCapture 与 VideoWriter 对象的使用、MJPG 等编解码格式配置、特定帧截取方法,以及摄像头读取失败的常见排查步骤,帮助开发者快速掌握视频处理核心技能。
实验介绍
实验介绍
本实验旨在指导用户利用 OpenCV 库读取摄像头的视频流。用户既可以直接调用笔记本电脑内置摄像头,也可以通过 USB 接口连接外部摄像头。若操作过程中遇到摄像头读取失败的情况,实验提供了相应的排查步骤。此外,视频处理还涉及视频编解码格式的设定以及特定帧的读取方法。实验最后包含 OpenCV 项目实战,演示如何完成视频录制与视频读取操作。
知识点
- 视频录制
- 视频编解码格式
- 视频读取以及特定帧的读取
视频录制实战
视频录制
使用 OpenCV 进行视频录制,核心在于使用 VideoWriter 对象。录制的初始步骤是实例化一个 VideoCapture 对象,该对象负责从摄像头读取图像数据。创建 VideoCapture 对象的代码如下:
cap = cv2.VideoCapture(0)
类 VideoCapture 提供了两种常见的构造函数用法:
<VideoCaputrue object> = cv2.VideoCapture(filename)
功能:打开本地视频文件;
参数 filename:指定视频文件的路径及名称。
<VideoCaputrue object> = cv2.VideoCapture(index)
功能:打开相机设备;
参数 index:指定相机设备 ID,若系统仅连接一个相机,通常设置为 0。
在 OpenCV 中实现视频录制,需借助 VideoWriter 对象。该对象将从 VideoCapture 获取的图像帧持续写入数据流中。创建 VideoWriter 对象的代码如下:
out = cv2.VideoWriter('video_record.avi', codec, fps, frameSize)
本实验以笔记本电脑内置摄像头为例,演示捕获视频并实时显示视频流的过程。首先实现单帧图像的捕获,基本逻辑为:打开相机、检查相机是否成功打开、若成功则捕获一帧图像、通过 imshow 显示图像,最后关闭相机。具体代码如下:
import cv2
cap = cv2.VideoCapture(0)
if cap.isOpened():
ret,frame = cap.read()
cv2.imshow('frame',frame)
cv2.waitKey(3000)
cap.release()
cv2.destroyAllWindows()
相机捕获的单帧图像效果如图所示:

视频编解码格式解析
视频编解码格式
在写入视频文件时,必须指定视频的编解码格式,本例中指定为 MJPG 格式。指定视频编解码方式的代码如下:
codec = cv2.VideoWriter_fourcc(*'MJPG')
在深入讲解视频编解码格式之前,需先了解 FourCC 概念。
FourCC 全称 Four-Character Codes,即四字符代码,它是一个 32 位的标识符,本质上是 typedef unsigned int FOURCC。FourCC 是一种用于独立标识视频数据流格式的四字符代码标准。
所有支持的 FourCC 视频编解码格式均可在 FourCC 官方网站上查询。

指定视频编解码格式为 MJPG 后,还需设定视频的帧率及窗口大小。设定写入帧率为 30 以及窗口大小的代码如下:
fps = 30.0
frameSize = (640, 480)
初始化 VideoWriter 时,需将上述参数传入,并指定输出视频文件的名称。本例中将输出视频文件命名为 video.avi,具体代码如下:
out = cv2.VideoWriter('video.avi', codec, fps, frameSize)
视频录制演示完整代码
接下来,需要不断从 VideoCapture 中读取图像,并将其写入 VideoWriter 的数据流中。持续向视频输出流写入帧图像的代码如下:
out.write(frame)
视频录制结束后,为节省系统资源,需释放已占用的资源。具体代码实现如下:
cap.release()
out.release()
视频录制演示完整代码如下:
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
codec = cv2.VideoWriter_fourcc(*'MJPG')
fps = 20.0
frameSize = (640, 480)
out = cv2.VideoWriter('video.avi', codec, fps, frameSize)
print("按键Q-结束视频录制")
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) == ord('q'):
break
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
视频读取与特定帧截取
视频读取以及特定帧的读取
视频读取函数介绍及实现
读取视频时,同样需要使用 VideoCapture 对象,但传入参数不再是摄像头 ID,而是视频文件的路径。读取视频流时可逐帧捕获并处理图像。此时读入视频流的代码如下:
cap = cv2.VideoCapture('video.avi')
OpenCV 提供了 VideoWriter 接口用于视频保存,具体函数表示如下:
cap = cv2.VideoCapture('video.avi')
函数参数说明:
- filename:指定保存视频的文件名;
- fourcc:指定视频编解码器的4字节代码;
-
【(‘P',‘I',‘M',‘1')代表 MPEG-1 编解码器】
-
【(‘M',‘J',‘P','G ')代表 Motion JPEG 编解码器】
-
- fps:视频帧率;
- frameSize:视频帧的尺寸大小。
从视频文件中播放视频时,需调整相机索引与视频文件名。在显示帧时,需设置合适的 cv2.waitKey() 时间值;若该值过小,视频播放速度过快;若过大,视频播放过慢(此特性可用于慢动作显示)。正常播放时,设置为 25 毫秒即可。具体视频读取的源代码如下:
import numpy as np
import cv2
cap = cv2.VideoCapture('video.avi')
while(True):
ret, frame = cap.read()
if ret:
cv2.imshow('frame',frame)
else:
print("视频读取完毕或者视频路径异常")
break
if cv2.waitKey(25) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
视频写入完成,文件名为 video.avi,结果展示如下:


视频特定帧的读取(通过帧数间隔截取视频帧)
通过设置视频帧数间隔来截取视频的每一帧,本例中设置帧间隔为 20,即每隔 20 帧截取一帧图像,并将截取的每一帧保存至自定义文件夹中。保存路径为代码所在目录下的 capture_image 文件夹。具体实现的代码如下:
import cv2
cap = cv2.VideoCapture("video.avi")
c = 1
frameRate = 20
while(True):
ret, frame = cap.read()
if ret:
if(c % frameRate == 0):
print("开始截取视频第:" + str(c) + " 帧")
cv2.imwrite("./capture_image/" + str(c) + '.jpg', frame)
c += 1
cv2.waitKey(0)
else:
print("所有帧都已经保存完成")
break
cap.release()
运行结果如下,展示了截取的视频帧数间隔情况:

如图所示为视频截取的最后一帧图像:

注意:读取视频文件和保存图片的路径中,路径分隔符必须使用“\\”,若使用“/”或“\”可能导致打开文件报错。
摄像头读取失败排查指南
摄像头读取失败-问题排查
若运行上述源代码时出现报错,
可参考以下思路进行自查:
- 驱动问题:部分摄像头可能存在驱动兼容性问题,需安装相应驱动程序,或确认摄像头是否支持 UAC(USB Audio Class)免驱协议。
- USB接口兼容性问题:若将 USB 3.0 摄像头插入 USB 2.0 接口,可能无法正常工作(此情况仅针对外接 USB 摄像头,使用笔记本内置摄像头可忽略)。
- 设备挂载问题:摄像头可能未被系统正确挂载,若在虚拟机环境中运行,需手动勾选设备连接。
- 硬件问题:检查 USB 线缆及电脑 USB 接口是否完好。
- 视频压缩格式的问题:部分视频压缩格式可能不被 OpenCV 支持。
实验总结
实验总结
初学者可能会觉得 OpenCV 处理视频较为复杂,因其涉及众多函数且用法各异。若要通过 OpenCV 调用摄像头完成任务,需系统学习相关函数。本实验从视频录取、视频读取到特定帧读取,逐步引导实现全过程,并对相关函数及参数进行了透彻讲解。涉及实践的部分已提供完整源代码,确保学习过程无障碍。此外,实验末尾提供了摄像头读取失败的排查步骤,帮助用户解决实际操作中的问题。
到此这篇关于教你如何用python操作摄像头以及对视频流的处理的文章就介绍到这了,更多相关python操作摄像头及视频流内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









