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一致)matframe 要显示的帧数据(numpy 数组)
- 代码中的作用 :将摄像头读取的
frame实时显示在vedio窗口中,实现 "预览" 效果。
9. vw.write(frame)
- 功能 :将单帧数据写入视频文件(需确保
frame分辨率和VideoWriter初始化的frameSize一致)。 - 参数 :
frame为读取到的视频帧(numpy 数组)。
- 代码中的作用 :将实时预览的帧同步写入
cc2.mp4文件,实现 "录制" 功能。
0. cv2.waitKey(delay)
-
功能:等待键盘按键事件,同时控制视频播放的帧率(核心:处理 OpenCV 窗口的刷新)。
-
参数详解 :
参数取值 你的代码取值 含义说明 delay40等待时间(毫秒): 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 个关键点
① VideoWriter 的 frameSize 必须和摄像头实际输出分辨率一致(否则写入失败);
② 编码格式(FourCC)和文件后缀要匹配(MJPG→AVI,mp4v→MP4);
③ cv2.waitKey() 不能省略,否则窗口会卡死(无法刷新)。