【OpenCV 例程 300篇】252.视频文件的读取与保存

『youcans 的 OpenCV 例程300篇 - 总目录』


【youcans 的 OpenCV 例程 300篇】252. 视频文件的读取与保存


视频文件是由一系列图像组成的,视频的每一帧都是一幅图像。
OpenCV提供了VideoCapture类和VideoWriter类处理视频流,既可以处理视频文件,也可以处理摄像头设备。

函数原型

cv.VideoCapture( index[, apiPreference] )<VideoCapture object>
cv.VideoCapture(filename[, apiPreference])<VideoCapture object>
cv.VideoWriter([filename, fourcc, fps, frameSize[, isColor]])<VideoWriter object>

VideoCapture类用于读取视频文件、视频流或从摄像机捕获视频,VideoWriter类用于视频文件的写入和保存。
构造函数cv.VideoCapture和cv.VideoWrite用于实现类的初始化。


参数说明:

● index:摄像头的 ID 编号,0 表示默认后端打开默认摄像机
● filename:读取或保存的视频文件的路径,包括扩展名
● apiPreference:读取视频流的属性设置
● fourcc:用于压缩帧的编码器/解码器的字符代码,
- CV_FOURCC(‘I’,‘4’,‘2’,‘0’),未压缩的YUV编码格式,扩展名为 .avi
- CV_FOURCC(‘P’,‘I’,‘M’,‘1’),MPEG-1 编码格式,扩展名为 .avi
- CV_FOURCC( ‘X’,‘V’,‘I’,‘D’),MPEG-4 编码格式,扩展名为 .avi
- CV_FOURCC( ‘F’,‘L’,‘V’,‘I’),Flash 编码格式,件扩展名为 .flv
● fps:视频流的帧速率
● frameSize:元组 (w, h),视频帧的宽度和高度
● isColor:是否彩色图像


成员函数:

  • cv.VideoCapture.isOpened(),检查视频捕获是否初始化成功
  • cv.VideoCapture.read(),捕获视频文件、视频流或捕获的视频设备
  • cv.VideoCapture.release(),关闭视频文件或设备,释放对象
  • cv.VideoCapture.get(propId) ,获取 VideoCapture 类对象的属性
  • cv.VideoCapture.set(propId, value),设置 VideoCapture 类对象的属性
  • cv.VideoWriter.fourcc(c1, c2, c3, c4[, ]),构造编码器/解码器的fourcc代码
  • cv.VideoWriter.write(image[, ]),写入下一帧视频
  • cv.VideoWriter.release(),关闭视频写入,释放对象

注意问题:

  • ⒈读取视频文件、视频流中读取时,通过 filename 传递视频文件、视频流的路径。使用摄像头时,通过 index 传递摄像头的 ID 号。
  • ⒉使用摄像头时,index=0 表示默认后端打开默认摄像机,例如笔记本内置摄像头。可以使用计算机的内置或外接的摄像头,也支持本地网络或公共网络的 IP 摄像机。
  • ⒊视频写入类VideoWriter的参数frameSize是元组 (w, h),即视频帧的宽度和高度,而OpenCV图像的形状是 (h, w),注意二者的顺序是反的。
  • ⒋视频处理过程较为复杂,一些程序设置与具体系统环境有关,本文只介绍基本的成员函数,通用的处理方法。更多内容详见:[https://docs.opencv.org/]。
  • ⒌视频处理中的很多问题涉及摄像机和计算机的硬件设备,需要结合具体系统环境来分析。

【例程0106】视频文件的读取、播放和保存

本例程示例读取和播放计算机中的视频文件,每隔若干帧抽取一帧保存为新的视频文件。

  • 视频读取的基本步骤为:
    (1)创建视频读取/捕获对象;
    (2)获取视频的一帧图像;
    (3)检查视频获取是否成功;
    (4)释放视频读取/捕获对象。

  • 保存视频文件的基本步骤为:
    (1)设置写入视频的格式和参数;
    (2)创建视频写入对象;
    (3)写入一帧图像;
    (4)释放视频写入对象。


# 【0106】视频文件的读取、播放和保存
import cv2 as cv

if __name__ == '__main__':
    # 创建视频读取/捕获对象
    vedioRead = "../images/nasa_m420p.mov"  # 读取视频文件的路径
    capRead = cv.VideoCapture(vedioRead)  # 实例化 VideoCapture 类

    # 设置写入视频图像的高,宽,帧速率和总帧数
    width = int(capRead.get(cv.CAP_PROP_FRAME_WIDTH))  # 960
    height = int(capRead.get(cv.CAP_PROP_FRAME_HEIGHT))  # 540
    fps = round(capRead.get(cv.CAP_PROP_FPS))  # 30
    frameCount = int(capRead.get(cv.CAP_PROP_FRAME_COUNT))  # 1826
    print(height, width, fps, frameCount)

    # 创建写入视频对象
    # fourcc = cv.VideoWriter_fourcc('X', 'V', 'I', 'D')  # 编码器设置 XVID
    fourcc = cv.VideoWriter_fourcc(*'XVID')  # 'X','V','I','D' 简写为 *'XVID'
    vedioWrite = "../images/nasa.avi"  # 写入视频文件的路径
    capWrite = cv.VideoWriter(vedioWrite, fourcc, fps, (width, height))

    # 读取视频文件,抽帧写入视频文件
    frameNum = 0  # 视频帧数初值
    timef = 30  # 设置抽帧间隔
    while capRead.isOpened():  # 检查视频捕获是否成功
        ret, frame = capRead.read()  # 读取下一帧视频图像
        if ret is True:
            frameNum += 1  # 读取视频的帧数
            cv.imshow(vedioRead, frame)  # 播放视频图像
            if (frameNum % timef == 0):  # 判断抽帧条件
                capWrite.write(frame)  # 将当前帧写入视频文件
            if cv.waitKey(1) & 0xFF == ord('q'):  # 按 'q' 退出
                break
        else:
            print("Can't receive frame at frameNum {}".format(frameNum))
            break

    capRead.release()  # 关闭读取视频文件
    capWrite.release()  # 关闭视频写入对象
    cv.destroyAllWindows()  # 关闭显示窗口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【本节完】

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/127333535)
Copyright 2022 youcans, XUPT
Crated:2022-12-15

猜你喜欢

转载自blog.csdn.net/youcans/article/details/125226884