OpenCV 从零学习 · 第 15 讲:视频的读取与写入
函数:cv2.VideoCapture / cv2.VideoWriter | 难度:★★☆☆☆
视频本质就是一帧帧图像。OpenCV 用 VideoCapture 逐帧读、VideoWriter 逐帧写。把前面学的灰度化、滤波、边缘、轮廓全套到每一帧上,就能做"视频滤镜 / 视频检测"。
一、读取视频 / 摄像头
cap = cv2.VideoCapture('input.mp4') # 文件
# cap = cv2.VideoCapture(0) # 0 = 默认摄像头
while cap.isOpened():
ret, frame = cap.read() # ret: 是否读到;frame: 这一帧
if not ret:
break
# ... 对 frame 做处理 ...
cap.release()
| 要点 | 说明 |
cap.read() | 返回 (ret, frame),务必判断 ret |
cap.isOpened() | 文件能否打开 / 摄像头是否就绪 |
cap.release() | 用完必须释放,否则文件被占用 |
二、写出视频 VideoWriter
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 编码器
out = cv2.VideoWriter('out.mp4', fourcc, 25.0, (640, 480))
out.write(frame) # 逐帧写入
out.release()
| 参数 | 含义 |
fourcc | 编码器,mp4v / XVID / MJPG 等 |
fps | 帧率,如 25.0 |
frameSize | 尺寸 (宽, 高),必须和帧一致 |
场景 A · 给视频批量加处理
读一帧 → 转灰度 / 高斯模糊 / Canny → 写回去,得到"素描风"或"油画风"视频。前面每一讲的函数都能直接复用。
读一帧 → 转灰度 / 高斯模糊 / Canny → 写回去,得到"素描风"或"油画风"视频。前面每一讲的函数都能直接复用。
场景 B · 摄像头流存成文件
把
把
VideoCapture(0) 的实时帧不断 out.write(),就能录屏/录像(配合第 16 讲实时循环)。
⚠ 新手必踩坑
- frameSize 是 (宽, 高),和
frame.shape的 (高,宽,通道) 顺序相反,写反会导致保存失败或画面错乱。 - 读到的 frame 一定要先判
ret,视频末尾ret=False时必须 break,否则会卡死或写空帧。 - 编码器(fourcc)和文件扩展名要配套:
mp4v→.mp4,XVID→.avi;部分编码器未安装会静默失败(文件 0 字节)。 - cap 和 out 都要 release(),否则输出文件可能损坏打不开。
本讲要点
- 视频 = 帧序列;
read()返回 (ret, frame),判 ret 再处理。 VideoWriter的 frameSize 用 (宽,高),与 shape 顺序相反。- fourcc 与扩展名配套;cap/out 用完都要 release。
下一讲:第 16 讲 · 摄像头实时处理(VideoCapture 循环 + imshow)——把所有算法搬到"实时画面"上,做实时滤镜/检测。
