《数字图像处理-OpenCV/Python》连载(7)视频文件的读取与保存

2023-09-18 11:21:42

《数字图像处理-OpenCV/Python》连载(7)视频文件的读取与保存


本书京东优惠购书链接:https://item.jd.com/14098452.html
本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html

在这里插入图片描述


第1章 图像的基本操作

为了方便初学者从零开始学习OpenCV-Python,本书从图像的读取、保存和显示等基本操作开始介绍,使读者可以循序渐进地使用和理解本书的每一个例程。


1.4 视频文件的读取与保存

视频文件是由一系列图像组成的,视频的每一帧都是一幅图像。

OpenCV中的VideoCapture类和VideoWriter类处理视频流,既可以处理视频文件,也可以处理摄像头设备。

VideoCapture类用于读取视频文件、视频流或从摄像头捕获视频;VideoWriter类用于视频文件的写入和保存。在Python语言中,可通过函数cv.VideoCapture和cv.VideoWrite实现类的初始化。

函数原型

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


参数说明

  • index:摄像头的ID编号,index=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():关闭视频写入,释放对象。

注意问题

(1) 在读取视频文件或视频流时,可通过filename指定视频文件或视频流的路径。在使用摄像头时,可通过index定义摄像头的ID编号。
(2) 使用摄像头设备时,index=0表示默认从后端打开摄像头,如笔记本内置摄像头,支持计算机内置或外接的摄像头,也支持本地网络或公共网络的IP摄像头。
(3) 视频写入类VideoWriter的参数frameSize是元组(w,h),即视频帧的宽度和高度,而OpenCV图像的形状表示为(h,w),注意二者的顺序相反。
(4) 视频处理过程较为复杂,一些程序设置与具体系统环境有关,本节只介绍基本的成员函数和通用的处理方法。更多内容详见OpenCV说明文档(链接1-1)。
(5) 视频处理过程中的很多问题都会涉及计算机和摄像机的硬件设备及设置,需要结合具体系统和环境来分析。建议读者参考【例程0106】和【例程0107】,先确认视频读取和设备捕获环境的配置是否正确,再调试和运行其他的视频处理程序。


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

本例程能读取和播放视频文件,并可每隔若干帧抽取一帧,保存为新的视频文件。

读取视频文件的基本步骤如下。
(1) 创建视频,读取/捕获对象。
(2) 逐帧获取视频图像。
(3) 检查获取图像帧是否成功。
(4) 释放视频,读取/捕获对象。

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


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

if __name__ == '__main__':
    # 创建视频,读取/捕获对象
    vedioRead = "../images/vedioDemo1.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/vedioSave1.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()  # 关闭显示窗口

在这里插入图片描述

在这里插入图片描述


本书京东优惠购书链接:https://item.jd.com/14098452.html


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

欢迎关注本书CSDN独家连载专栏
《数字图像处理-OpenCV/Python》连载: https://blog.csdn.net/youcans/category_12418787.html

更多推荐

进程,线程切换

目录Linux线程切换:Linux进程切换:进程切换和线程切换的区别虚拟地址空间切换耗时的原因Linux线程切换:Linux线程切换的实现涉及到操作系统的调度和线程上下文的切换。线程上下文包括程序计数器(PC)和寄存器值,以及线程的堆栈和堆栈指针等。操作系统通过调度器决定哪个线程将获得CPU时间片来执行。当一个线程被操

蓝桥杯 题库 简单 每日十题 day2

01卡片题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。小蓝有很多数字卡片,每张卡片上都是数字0到9。小蓝准备用这些卡片来拼一些数,他想从1开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。小蓝想知道自己能从1拼到多少。例如,当小蓝有30张卡片,其中0到9各3张,则小蓝可以

Vue记录(上篇)

Helloworld案例<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><title>初识Vue</title><!--引入Vue--><scripttype="text/javascript"src="./vue.js"></script><scr

linux-checklist命令行

常用的linux命令行:首先打开终端,可用Ctrl+Alt+T快捷键打开.1.一些简单的命令下面是一些常用的简单命令:日期date//显示当前时间cal//显示日历(一般是一整个月)磁盘df//查看磁盘剩余空间free//显示空闲内存数量结束终端exit幕后控制台幕后控制台是和终端仿真器环境相同,不过外表不太美观,在不

图像处理之频域滤波DFT

摘要:傅里叶变换可以将任何满足相应数学条件的信号转换为不同系数的简单正弦和余弦函数的和。图像信号也是一种信号,只不过是二维离散信号,通过傅里叶变换对图像进行变换可以图像存空域转换为频域进行更多的处理。本文主要简要描述傅里叶变换以及其在图像处理中的简单应用,并进行一些简单的实验来描述其相关性质。关键字:傅里叶变换,二维傅

JavaScript学习笔记03

JavaScript笔记03流程控制if判断和Java中if语句的使用方法相同。例:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><script>"usestrict";letscore=90;if(score==

11、Kubernetes核心技术 - Service

目录一、概述二、Endpoint三、Service资源清单四、Service类型4.1、ClusterIP4.2、NodePort4.3、LoadBalancer4.4、ExternalName五、Service使用5.1、ClusterIP5.1.1、定义Pod资源清单5.1.2、创建Pod5.1.3、定义Servi

【从零学习python 】74. UDP网络程序:端口问题与绑定信息详解

文章目录udp网络程序-端口问题UDP绑定信息总结进阶案例udp网络程序-端口问题在运行UDP网络程序时,会遇到端口号会变化的情况。每次重新运行网络程序后,可以观察到运行中的“网络调试助手”显示的数字是不同的。这是因为该数字标识了网络程序的唯一性,系统在重新运行时会随机分配端口号。需要注意的是,在网络程序运行过程中,该

如何从市场上几千只股票中快速选出满意的股票

个人账户实现股票量化程序化自动交易,券商有接口,门槛已降低_股票程序交易接口的博客-CSDN博客像上面的例子,如果按照市面上常见的可转债万3或万2不免5,人工操作+费率限制,这种情况就不要想,根本没机会,有了自动交易这把利器,再加python强大的支持库,能发挥的想像空间实在太大了,目前来看,机会是有,但后期用程序交易

【计算机网络 - 自顶向下方法】计算机网络和因特网

目录1.WhatistheInternet?1.1因特网的具体构成1.2因特网的功能2.Networkcore2.1基本介绍2.2分组交换2.2.1序列化时延2.2.2排队延迟和丢包2.2.3分组交换的优缺点2.3电路交换2.3.1基本概念2.3.2电路交换网络中的复用2.3.3电路交换文件传输时间2.3.4分组交换与

SpringBoot整合Redis,基于Jedis实现redis各种操作

前言(三步教你学会redis,主打一个实用)springboot整合redis步骤,并基于jedis对redis数据库进行相关操作,最后分享非常好用、功能非常全的redis工具类。第一步:导入maven依赖<!--springboot整合redis--><dependency><groupId>org.springfr

热文推荐