OpenCV 中摄像头视频采集 + 实时显示 + 视频保存

python 复制代码
#windows系统下
import cv2

#创建窗口
cv2.namedWindow('vedio', cv2.WINDOW_NORMAL)
cv2.resizeWindow('vedio', 640, 480)

save_path = r'D:\record_videos\cc2.avi'

# #创建多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
vw = cv2.VideoWriter(save_path, fourcc, 25,(640,480))
cap = cv2.VideoCapture(0)  #获取电脑摄像头的视频
# # cap = cv2.VideoCapture("D:\\555.mp4") #文件路径下访问视频

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print("无法读取视频帧,退出录制")
        break
    #将视频帧在窗口中显示
    cv2.imshow('vedio', frame)
    #写数据到多媒体文件
    vw.write(frame)

    #等待键盘事件
    key = cv2.waitKey(40)  #里面是0是一直等待
    if(key & 0xFF == ord('q')):
        break

cap.release()
vw.release()
cv2.destroyAllWindows()
print(f"视频已保存到:{save_path}")

一、核心 API 功能 + 参数详解

1.cv2.namedWindow(winname, flags)
  • 功能 :创建一个用于显示图像 / 视频帧的窗口(提前创建窗口可自定义窗口属性,比 cv2.imshow() 自动创建更灵活)。
  • 参数详解
参数名 取值(上述代码) 含义说明
winname 'vedio' 窗口名称(字符串),后续 cv2.imshow()/cv2.resizeWindow() 需用相同名称关联窗口
flags cv2.WINDOW_NORMAL 窗口属性标志: WINDOW_NORMAL:窗口可手动调整大小; WINDOW_AUTOSIZE(默认):窗口大小固定为显示内容的尺寸,无法拖动调整
  • 代码中的作用 :创建名为 vedio 的可缩放窗口,为后续显示摄像头帧做准备。
2.cv2.resizeWindow(winname, width, height)
  • 功能 :调整已创建窗口的大小(必须在 cv2.namedWindow() 之后调用)。
  • 参数详解
参数名 取值(上述代码) 含义说明
winname 'vedio' 要调整的窗口名称(需和 namedWindow 一致)
width 640 窗口宽度(像素)
height 480 窗口高度(像素)
  • 代码中的作用 :将 vedio 窗口固定为 640×480 尺寸,避免窗口默认大小过大 / 过小。
3.cv2.VideoWriter_fourcc(c1, c2, c3, c4)

cv2.VideoWriter_fourcc() 是 OpenCV 中用于生成四字符编码(FourCC Code) 的核心函数,返回值是一个 32 位无符号整数(int 类型),本质是视频编码格式的 "唯一标识"------VideoWriter 需通过这个标识确定用哪种编码器压缩视频帧并写入文件。

  • 四个参数(c1/c2/c3/c4)的核心规则
参数位 类型要求 功能本质 约束条件
c1 单个 ASCII 字符(字符串,长度 = 1)或对应 ASCII 整数值 四字符编码的第一个字符,构成编码标识的首段 1. 字符 / 数值需匹配编码标准的规范;2. 大小写敏感(如 MJPG 需大写,mp4v 需小写);3. 四个参数顺序不可颠倒
c2 同上 四字符编码的第二个字符,构成编码标识的第二段 同上
c3 同上 四字符编码的第三个字符,构成编码标识的第三段 同上
c4 同上 四字符编码的第四个字符,构成编码标识的第四段
  • 代码中的作用 :指定视频用 MJPG 编码,为 VideoWriter 初始化提供编码规则。
  • 传参的两种合法形式
传参形式 示例(MJPG 编码) 说明
原生形式(逐个传单字符) cv2.VideoWriter_fourcc('M', 'J', 'P', 'G') 最严谨的原生写法,直接传入 4 个独立的单字符,符合函数参数定义
解包形式(简化写法) cv2.VideoWriter_fourcc(*'MJPG') Python 语法:* 用于解包字符串(字符串是字符的可迭代对象),将 'MJPG' 拆分为 'M'/'J'/'P'/'G' 四个独立参数,与原生形式完全等价(常用)
4.cv2.VideoWriter(filename, fourcc, fps, frameSize)
  • 功能:初始化视频写入器,用于将帧数据写入本地视频文件。
  • 参数详解
参数名 取值(上述代码) 含义说明
filename D:\record_videos\cc2.avi 保存视频的路径(Windows 用原始字符串 r'' 避免反斜杠转义)
fourcc 上面创建的 fourcc 对象 视频编码格式(FourCC 码)
fps 25 视频帧率(每秒帧数),建议和摄像头实际帧率一致(你的代码用 25 是通用值)
frameSize (640,480) 视频帧的分辨率(宽 × 高),必须和摄像头输出的帧尺寸完全一致(否则写入失败)
  • 代码中的作用 :创建写入器 vw,准备将帧以 MJPG 编码、25fps、640×480 分辨率写入D:\record_videos\cc2.avi。
5. cv2.VideoCapture(index/filepath)
  • 功能:初始化视频捕获对象,用于读取摄像头 / 本地视频文件的帧。

  • 参数详解

    参数取值 含义说明
    **index**数字(摄像头索引) 读取电脑摄像头:0:默认第一个摄像头; 1:第二个摄像头(如有外接)
    **filepath**字符串(文件路径) 读取本地视频文件(Windows 路径需双反斜杠或原始字符串)
  • 代码中的作用 :创建捕获对象 cap,读取电脑默认摄像头(索引 0)的视频流。
6. cap.isOpened()
  • 功能 :判断 VideoCapture 对象是否成功打开(摄像头 / 视频文件),返回布尔值(True/False)。
  • 参数 :无(属于 VideoCapture 的成员方法)。
  • 代码中的作用:作为循环条件,确保只有摄像头正常打开时才执行后续帧读取逻辑。
7. cap.read()
  • 功能:从摄像头 / 视频文件读取一帧数据,返回两个值。

  • 返回值详解

    返回值 含义说明
    ret 布尔值:True 表示帧读取成功,False 表示读取失败(如摄像头断开 / 视频播放完毕)
    frame 读取到的帧数据(numpy 数组),格式为 BGR(OpenCV 默认色彩空间)
  • 代码中的作用:循环读取摄像头的每一帧,若读取失败则退出循环,避免程序崩溃。
8. cv2.imshow(winname, mat)
  • 功能:在指定窗口中显示图像 / 视频帧。

  • 参数详解

    参数名 取值(上述代码) 含义说明
    winname 'vedio' 要显示的窗口名称(需和 namedWindow 一致)
    mat frame 要显示的帧数据(numpy 数组)
  • 代码中的作用 :将摄像头读取的 frame 实时显示在 vedio 窗口中,实现 "预览" 效果。
9. vw.write(frame)
  • 功能 :将单帧数据写入视频文件(需确保 frame 分辨率和 VideoWriter 初始化的 frameSize 一致)。
  • 参数frame 为读取到的视频帧(numpy 数组)。
  • 代码中的作用 :将实时预览的帧同步写入 cc2.mp4 文件,实现 "录制" 功能。
0. cv2.waitKey(delay)
  • 功能:等待键盘按键事件,同时控制视频播放的帧率(核心:处理 OpenCV 窗口的刷新)。

  • 参数详解

    参数取值 你的代码取值 含义说明
    delay 40 等待时间(毫秒): 40:约 1000/40 = 25fps,是 25fps 的录制帧率; 0:无限等待,直到按下任意键(适合静态图片显示);返回值:按下的按键的 ASCII 码(未按键返回 -1)
  • 代码中的作用 :① 控制循环频率,让预览窗口流畅显示;② 检测是否按下 q键(ord('q') 获取 q 的 ASCII 码),按下则退出循环。
11. cap.release() / vw.release()
  • 功能 :释放 VideoCapture/VideoWriter 占用的系统资源(摄像头 / 文件句柄)。
  • 参数:无(成员方法)。
  • 代码中的作用:程序结束后释放摄像头(否则其他程序无法使用摄像头)、关闭视频文件(否则文件可能损坏无法播放)。
12. cv2.destroyAllWindows()
  • 功能:关闭所有由 OpenCV 创建的窗口,释放窗口占用的内存。
  • 参数:无。
  • 代码中的作用 :程序退出时关闭 vedio 窗口,避免窗口残留。

二、总结

1. 必记的 API 分类
功能分类 核心 API 关键注意点
窗口管理 namedWindow/resizeWindow/imshow 窗口名称需统一,imshow 依赖 waitKey 刷新
视频捕获 VideoCapture/cap.read/cap.isOpened 摄像头索引从 0 开始,ret 必须做判空
视频保存 VideoWriter_fourcc/VideoWriter/vw.write 编码与文件后缀匹配、帧分辨率一致
资源释放 release/destroyAllWindows 必须执行,否则资源泄漏
2. 易踩坑的 3 个关键点

VideoWriterframeSize 必须和摄像头实际输出分辨率一致(否则写入失败);

② 编码格式(FourCC)和文件后缀要匹配(MJPG→AVI,mp4v→MP4);

cv2.waitKey() 不能省略,否则窗口会卡死(无法刷新)。

相关推荐
清水白石0082 小时前
《Python 中 deque vs list:性能差异全解析与高效数据结构实战指南》
数据结构·python·list
智航GIS2 小时前
7.2 Try Except语句
开发语言·python
王哈哈^_^2 小时前
【完整源码+数据集】道路交通事故数据集,yolo车祸检测数据集 7869 张,交通事故级别检测数据集,交通事故检测系统实战教程
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·毕业设计
程序员佳佳2 小时前
026年AI开发实战:从GPT-5.2到Gemini-3,如何构建下一代企业级Agent架构?
开发语言·python·gpt·重构·api·ai写作·agi
橙露2 小时前
Python 图形任意角度旋转完整解决方案:原理、实现与可视化展示
开发语言·python
大模型铲屎官2 小时前
【操作系统-Day 46】文件系统核心探秘:深入理解连续分配与链式分配的实现与优劣
人工智能·python·深度学习·大模型·操作系统·文件系统·计算机组成原理
每天早点睡3 小时前
format语句
python