欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

OpenCV 从零学习 · 第 15 讲:视频的读取与写入(VideoCapture / VideoWriter)

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 → 写回去,得到"素描风"或"油画风"视频。前面每一讲的函数都能直接复用。
场景 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)——把所有算法搬到"实时画面"上,做实时滤镜/检测。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功