OpenCV基础知识(9)— 视频处理(读取并显示摄像头视频、播放视频文件、保存视频文件等)

news2024/11/24 1:38:30

前言:Hello大家好,我是小哥谈。OpenCV不仅能够处理图像,还能够处理视频。视频是由大量的图像构成的,这些图像是以固定的时间间隔从视频中获取的。这样,就能够使用图像处理的方法对这些图像进行处理,进而达到处理视频的目的。要想处理视频,需要先对视频进行读取、显示、保存等相关操作。为此,OpenCV提供了VideoCapture类和VideoWrite类的相关方法。🌈

前期回顾:

        史上最全OpenCV常用方法及使用说明汇总,建议收藏!

        OpenCV基础知识(1)— OpenCV概述

        OpenCV基础知识(2)— 图像处理的基本操作 

        OpenCV基础知识(3)— 图像数字化基础(像素、色彩空间)

        OpenCV基础知识(4)— 绘制图形

        OpenCV基础知识(5)— 几何变换 

        OpenCV基础知识(6)— 滤波器

        OpenCV基础知识(7)— 腐蚀与膨胀

        OpenCV基础知识(8)— 图形检测 

        目录

 🚀1.读取并显示摄像头视频

💥💥1.1 VideoCapture类

💥💥1.2 如何使用VideoCapture类 

🚀2.播放视频文件

💥💥2.1 读取并显示视频文件

💥💥2.2 视频的暂停播放和继续播放

💥💥2.3 获取视频文件的属性

🚀3.保存视频文件

💥💥3.1 VideoWrite类

💥💥3.2 如何使用VideoWrite类

🚀4.总结

 🚀1.读取并显示摄像头视频

💥💥1.1 VideoCapture类

摄像头视频指的是从摄像头中实时读取到的视频为了读取并显示摄像头视频,OpenCV提供了VideoCapture类的相关方法,这些方法包括摄像头的初始化方法、检验摄像头初始化是否成功的方法、从摄像头中读取帧的方法、关闭摄像头的方法等。下面将依次对这些方法进行讲解。🌳

VideoCapture类提供了构造方法VideoCapture(),用于完成摄像头的初始化工作。

VideoCapture()的语法格式如下:

capture = cv2.VideoCapture(index)

参数说明:

capture:要打开的摄像头

index:摄像头的设备索引。当index的值为0时,表示要打开的是第1个摄像头;对于64位的Windows10笔记本,当index的值为0时,表示要打开的是笔记本内置摄像头。当index的值为1的时候,表示要打开的是第2个摄像头;对于64位的Windows10笔记本,当index的值为1时,表示要打开的是一个连接笔记本的外置摄像头。

为了检验摄像头初始化是否成功,VideoCapture类提供了isOpened()方法。isOpened()方法的语法格式如下所示:

retval = cv2.VideoCapture.isOpened()

参数说明:

retval:isOpened()方法的返回值。如果摄像头初始化成功,retval的值为True;否则,retval的值为False。

说明:♨️♨️♨️

1.视频是由大量的图像构成的,把这些图像称作

2.摄像头的数量及其设备索引的先后顺序由操作系统决定,并且OpenCV没有提供查询摄像头的数量及其设备索引的任何方法。

摄像头初始化后,就可以从摄像头中读取帧了,为此VideoCapture类提供了read()方法。read()方法的语法格式如下:

retval,image = cv2.VideoCapture.read()

参数说明:

retval:是否读取到帧。如果读取到帧,retval的值为True;否则,retval的值为False。

image:读取到的帧。因为帧指的是构成视频的图像,所以可以把“读取到的帧”理解为“读取到的图像”。

OpenCV在官网中特别强调,在不需要摄像头的时,要关闭摄像头。为此,VideoCapture类提供了release()方法,其语法格式如下:

cv2.VideoCapture.release()

💥💥1.2 如何使用VideoCapture类 

案例1:

读取并显示摄像头视频。具体代码如下:

import cv2

capture = cv2.VideoCapture(0) # 打开笔记本内置摄像头
while (capture.isOpened()): # 笔记本内置摄像头被打开后
    retval, image = capture.read() # 从摄像头中实时读取视频
    cv2.imshow("Video", image) # 在窗口中显示读取到的视频
    key = cv2.waitKey(1) # 窗口的图像刷新时间为1毫秒
    if key == 32: # 如果按下空格键
        break
capture.release() # 关闭笔记本内置摄像头
cv2.destroyAllWindows() # 销毁显示摄像头视频的窗口

运行效果如图所示:

哈哈哈哈......,差点截到我,拿手机挡一下。🍉 🍓 🍑 🍈 🍌 🍐

如何关闭摄像头呢?其实很简单,按下空格键即可关闭笔记本内置摄像头,销毁显示摄像头视频的窗口。

当按下空格键后,PyCharm会显示如下图所示的警告信息。

为了消除该警告信息,需要将上述代码中的

capture = cv2.VideoCapture(0)

 修改为如下代码:

capture = cv2.VideoCapture(0,cv2.CAP_DSHOW)

如果想打开的是一个连接笔记本的外置摄像头,那么需要将上述代码中的

capture = cv2.VideoCapture(0)

修改为如下代码:

capture = cv2.VideoCapture(1,cv2.CAP_DSHOW)

案例1已经成功读取并显示了摄像头视频,那么如何对这个视频进行处理呢?其实,处理视频所用的方法与处理图像所用的方法是相同的。具体请看案例2。

案例2:

将摄像头视频由彩色视频转换为灰度视频。具体代码如下所示:

import cv2

capture = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 打开笔记本内置摄像头
while (capture.isOpened()): # 笔记本内置摄像头被打开后
    retval, image = capture.read() # 从摄像头中实时读取视频
    # 把彩色视频转换为灰度视频
    image_Gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    if retval == True: # 读取到摄像头视频后
        cv2.imshow("Video", image) # 在窗口中显示彩色视频
        cv2.imshow("Video_Gray", image_Gray) # 在窗口中显示灰度视频
    key = cv2.waitKey(1) # 窗口的图像刷新时间为1毫秒
    if key == 32: # 如果按下空格键
        break
capture.release() # 关闭笔记本内置摄像头
cv2.destroyAllWindows() # 销毁显示摄像头视频的窗口

运行结果如图所示:

哈哈...截取到了我房间的图片。🍉 🍓 🍑 🍈 🍌 🍐

那么,能否通过按键指令,保存并显示摄像头某一时刻的图像?当然可以了!来,继续看案例3。

案例3:

显示并保存摄像头某一时刻的图像。当按下空格键的时候,关闭笔记本内置摄像头,保存并显示此时摄像头视频中的图像。具体代码如下:

import cv2

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 打开笔记本内置摄像头
while (cap.isOpened()): # 笔记本内置摄像头被打开后
    ret, frame = cap.read() # 从摄像头中实时读取视频
    cv2.imshow("Video", frame) # 在窗口中显示视频
    k = cv2.waitKey(1) # 图像的刷新时间为1毫秒
    if k == 32: # 按下空格键
        cap.release() # 关闭笔记本内置摄像头
        cv2.destroyWindow("Video") # 销毁名为Video的窗口
        cv2.imwrite("D:/copy.png", frame) # 保存按下空格键时摄像头视频中的图像
        cv2.imshow('img', frame) # 显示按下空格键时摄像头视频中的图像
        cv2.waitKey() # 刷新图像
        break
cv2.destroyAllWindows() # 销毁显示图像的窗口

运行效果如图所示:

案例3除了能够显示摄像头视频某一时刻的图像外,还能够把上图保存在电脑根目录中(可自定义保存位置)。

保存的图像为:

案例1、案例2、案例3都是打开笔记本的内置摄像头,如果要在打开笔记本内置摄像头的同时,再打开一个连接笔记本的外置摄像头,应该如何实现呢? 

案例4:

读取并显示两个摄像头视频。具体代码如下:

import cv2

cap_Inner = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 打开笔记本内置摄像头
cap_Outer = cv2.VideoCapture(1, cv2.CAP_DSHOW) # 打开一个连接笔记本的外置摄像头
while (cap_Inner.isOpened() & cap_Outer.isOpened()): # 两个摄像头都被打开后
    retval, img_Inner = cap_Inner.read() # 从笔记本内置摄像头中实时读取视频
    ret, img_Outer = cap_Outer.read() # 从连接笔记本的外置摄像头中实时读取视频
    # 在窗口中显示笔记本内置摄像头读取到的视频
    cv2.imshow("Video_Inner", img_Inner)
    # 在窗口中显示连接笔记本的外置摄像头读取到的视频
    cv2.imshow("Video_Outer", img_Outer)
    key = cv2.waitKey(1) # 窗口的图像刷新时间为1毫秒
    if key == 32: # 如果按下空格键
        break
cap_Inner.release() # 关闭笔记本内置摄像头
cap_Outer.release() # 关闭连接笔记本的外置摄像头
cv2.destroyAllWindows() # 销毁显示摄像头视频的窗口

 运行效果就不演示了,大家可以自己试验下。(我没外置摄像头)📚


🚀2.播放视频文件

VideoCapture类及其方法除了能够读取并显示摄像头视频外,还能够读取并显示视频文件。当窗口根据视频文件的时长显示视频文件的时候,便实现了播放视频文件的效果。

💥💥2.1 读取并显示视频文件

VideoCapture类的构造方法VideoCapture()不仅能够用于完成摄像头的初始化工作,还能够用于完成视频文件的初始化工作。

VideoCapture()用于初始化视频文件的时候,其语法格式如下:

video = cv2.VideoCapture(filename)

参数说明:

video:要打开的视频

filename:打开视频的文件名。

案例5:

读取并显示视频文件。当按下【Esc】键时,关闭视频文件并销毁显示视频文件的窗口。就以我在港口现场拍摄的高风险作业视频为例。具体代码如下所示:

import cv2

video = cv2.VideoCapture("1.mp4") # 打开视频文件
while (video.isOpened()): # 视频文件被打开后
    retval, image = video.read() # 读取视频文件
    # 设置“Video”窗口的宽为420,高为300
    cv2.namedWindow("Video", 0)
    cv2.resizeWindow("Video", 420, 300)
    if retval == True: # 读取到视频文件后
        cv2.imshow("Video", image) # 在窗口中显示读取到的视频文件
    else: # 没有读取到视频文件
        break
    key = cv2.waitKey(1) # 窗口的图像刷新时间为1毫秒
    if key == 27: # 如果按下Esc键
        break
video.release() # 关闭视频文件
cv2.destroyAllWindows() # 销毁显示视频文件的窗口

运行效果如图所示: 

说明:♨️♨️♨️

调整waitKey()方法中的参数值可以控制视频文件的播放速度。例如,当cv2.waitKey(1)时,视频文件的播放速度非常快;当cv2.waitKey(50)时,就可以减缓视频文件的播放速度。

使用图像处理的相关方法可以把摄像头视频由彩色视频转换为灰度视频。那么,使用相同的方法,也能够将视频文件由彩色视频转换为灰度视频。

案例6:

将视频文件由彩色视频转换为灰度视频。具体代码如下所示:

import cv2

video = cv2.VideoCapture("1.mp4") # 打开视频文件
while (video.isOpened()): # 视频文件被打开后
    retval, img_Color = video.read() # 读取视频文件
    # 设置“Video”窗口的宽为420,高为300
    cv2.namedWindow("Gray", 0)
    cv2.resizeWindow("Gray", 420, 300)
    if retval == True: # 读取到视频文件后
        # 把“公司宣传.avi”由彩色视频转换为灰度视频
        img_Gray = cv2.cvtColor(img_Color, cv2.COLOR_BGR2GRAY)
        cv2.imshow("Gray", img_Gray) # 在窗口中显示读取到的视频文件
    else: # 没有读取到视频文件
        break
    key = cv2.waitKey(1) # 窗口的图像刷新时间为1毫秒
    if key == 27: # 如果按下Esc键
        break
video.release() # 关闭视频文件
cv2.destroyAllWindows() # 销毁显示视频文件的窗口

运行效果如图所示:

💥💥2.2 视频的暂停播放和继续播放

上述案例已经实现了在窗口中播放视频文件的效果。那么,能否在此基础上,通过按键指令,在播放视频的过程中,实现视频的暂停播放和继续播放呢?答案肯定是可以的了!

案例7:

视频的暂停播放和继续播放。当按下空格键的时候,暂停播放视频;当再次按下空格键的时候,继续播放视频;当按下【Esc】键时,关闭视频文件并销毁显示视频文件的窗口。

具体代码如下所示:

import cv2

video = cv2.VideoCapture("1.mp4") # 打开视频文件
while (video.isOpened()): # 视频文件被打开后
    retval, image = video.read() # 读取视频文件
    # 设置“Video”窗口的宽为420,高为300
    cv2.namedWindow("Video", 0)
    cv2.resizeWindow("Video", 420, 300)
    if retval == True: # 读取到视频文件后
        cv2.imshow("Video", image) # 在窗口中显示读取到的视频文件
    else: # 没有读取到视频文件
        break
    key = cv2.waitKey(50) # 窗口的图像刷新时间为50毫秒
    if key == 32: # 如果按下空格键
        cv2.waitKey(0) # 不刷新图像,实现暂停效果
        continue # 再按一次空格键,继续播放
    if key == 27: # 如果按下Esc键
        break
video.release() # 关闭视频文件
cv2.destroyAllWindows() # 销毁显示视频文件的窗口

运行效果如图所示:

💥💥2.3 获取视频文件的属性

在实际开发过程中,有时候需要获取视频文件的属性。为此,VideoCapture类提供了get()方法。get()方法的语法格式如下所示:

retval = cv2.VideoCapture.get(propID)

参数说明:

retval:获取到与propID对应的属性值

propID:视频文件的属性值

VideoCapture类提供视频文件的属性值及其含义如下表所示:

视频文件的属性值含义
cv2.CAP_PROP_POS_MSEC视频文件播放时的当前位置(单位:ms)
cv2.CAP_PROP_POS_FRAMES帧的索引,从0开始。
cv2.CAP_PROP_POS_AVI_RATIO视频文件的相对位置(0表示开始播放,1表示结束播放)
cv2.CAP_PROP_FRAME_WIDTH视频文件的帧宽度
cv2.CAP_PROP_FRAME_HEIGHT视频文件的帧高度
cv2.CAP_PROP_FPS帧速率
cv2.CAP_PROP_FOURCC用4个字符表示的视频编码格式
cv2.CAP_PROP_FRAME_COUNT视频文件的帧数
cv2.CAP_PROP_FORMATretrieve()方法返回的Mat对象的格式
cv2.CAP_PROP_MODE指示当前捕获模式的后端专用的值
cv2.CAP_PROP_CONVERT_RGB指示是否应将图像转换为RGB

说明:♨️♨️♨️

1.视频是由大量的、连续的图像构成的,把其中的每一幅图像称作一帧。

2.帧数指的是视频文件中含有的图像总数,帧数越多,视频播放时越流畅。

3.在播放视频的过程中,把每秒显示图像的数量称作帧速率(FPS,单位:帧/s)

4.帧的宽度指的是图像在水平方向上含有的像素总数。

5.帧的高度指的是图像在垂直方向上含有的像素总数。

案例8:

获取并输出视频文件的指定属性值。具体代码如下:

import cv2

video = cv2.VideoCapture("1.mp4") # 打开视频文件
fps = video.get(cv2.CAP_PROP_FPS) # 获取视频文件的帧速率
frame_Count = video.get(cv2.CAP_PROP_FRAME_COUNT) # 获取视频文件的帧数
frame_Width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH)) # 获取视频文件的帧宽度
frame_Height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 获取视频文件的帧高度
# 输出获取到的属性值
print("帧速率:", fps)
print("帧数:", frame_Count)
print("帧宽度:", frame_Width)
print("帧高度:", frame_Height)

 运行效果如图所示:

那么,能否使得窗口在播放视频文件的同时,动态显示当前视频文件的属性值?例如,当前视频播放到第几帧,该帧对应着视频第几秒等。

案例9:

动态显示视频文件的属性值。具体代码如下所示:

import cv2

video = cv2.VideoCapture("1.mp4") # 打开视频文件
fps = video.get(cv2.CAP_PROP_FPS) # 获取视频文件的帧速率
frame_Num = 1 # 用于记录第几幅图像(即第几帧),初始值为1(即第1幅图像)
while (video.isOpened()): # 视频文件被打开后
   retval, frame = video.read() # 读取视频文件
   # 设置“Video”窗口的宽为420,高为300
   cv2.namedWindow("Video", 0)
   cv2.resizeWindow("Video", 420, 300)
   if retval == True: # 读取到视频文件后
      # 当前视频播放到第几帧
      cv2.putText(frame, "frame: " + str(frame_Num), (0, 100),
               cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 0, 255), 5)
      # 该帧对应着视频的第几秒
      cv2.putText(frame, "second: " + str(round(frame_Num / fps, 2)) + "s",
               (0, 200), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 0, 255), 5)
      cv2.imshow("Video", frame) # 在窗口中显示读取到的视频文件
   else: # 没有读取到视频文件
      break
   key = cv2.waitKey(50) # 窗口的图像刷新时间为50毫秒
   frame_Num += 1 #
   if key == 27: # 如果按下Esc键
      break
video.release() # 关闭视频文件
cv2.destroyAllWindows() # 销毁显示视频文件的窗口

运行效果如图所示:


🚀3.保存视频文件

在实际开发过程中,很多时候希望保存一段视频。为此,OpenCV提供了VideoWrite类,下面就熟悉一下VideoWrite类的常用方法。

💥💥3.1 VideoWrite类

VideoWrite类的常用方法包括VideoWrite类的构造方法write()方法release()方法。其中,VideoWrite类的构造方法用于创建VideoWrite类对象,其语法格式如下:

<VideoWrite object> = cv2.VideoWrite(filename,fourcc,fps,frameSize)

参数说明:

VideoWrite object:VideoWrite类对象

filename:保存视频时的路径(含有文件名)

fourcc:用4个字符表示的视频编码格式

fps:帧速率

frameSize:每一帧的大小

在OpenCV中,使用cv2.VideoWrite_fourcc()来确定视频编码格式。

下表列出了几个常用的视频编码格式。

fourcc的值视频编码格式文件扩展名
cv2.VideoWrite_fourcc('1','4','2','0')未压缩的YUV颜色编码格式,兼容性好,但文件较大。.avi
cv2.VideoWrite_fourcc('P','I','M','I')MPEG-1编码格式.avi
cv2.VideoWrite_fourcc('X','V','I','D')MPEG-4编码格式,视频文件的大小为平均值。.avi
cv2.VideoWrite_fourcc('T','H','E','O')Ogg Vorbis编码格式,兼容性差。.ogv
cv2.VideoWrite_fourcc('F','L','V','I')Flash视频编码格式.flv

💥💥3.2 如何使用VideoWrite类

案例10:

保存一段摄像头视频。打开笔记本内置摄像头,实时读取并显示视频;然后按下【Esc】键,关闭笔记本内置摄像头,销毁显示摄像头视频的窗口,并且把打开摄像头到关闭摄像头的这段视频保存为PyCharm当前项目路径下的output.avi文件。具体代码如下所示:

import cv2

capture = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 打开笔记本内置摄像头
fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D') # 确定视频被保存后的编码格式
output = cv2.VideoWriter("output.avi", fourcc, 20, (640, 480)) # 创建VideoWriter类对象
while (capture.isOpened()): # 笔记本内置摄像头被打开后
    retval, frame = capture.read() # 从摄像头中实时读取视频
    if retval == True: # 读取到摄像头视频后
        output.write(frame) # 在VideoWriter类对象中写入读取到的帧
        cv2.imshow("frame", frame) # 在窗口中显示摄像头视频
    key = cv2.waitKey(1) # 窗口的图像刷新时间为1毫秒
    if key == 27: # 如果按下Esc键
        break
capture.release() # 关闭笔记本内置摄像头
output.release() # 释放VideoWriter类对象
cv2.destroyAllWindows() # 销毁显示摄像头视频的窗口

当按下【Esc】键的时候,会在PyCharm当前项目目录下生成一个名为“output.avi”的视频文件。双击该视频文件,即可浏览被保存的摄像头视频。

说明:♨️♨️♨️

如果重复运行,新产生的output.avi文件会覆盖已经存在的output.avi文件。

上述案例录制的视频文件时长是由是否按下【Esc】键决定的,那么能否对这段时间间隔进行设置呢?例如,打开摄像头并显示10s的摄像头视频。答案是可以的!

案例11:

保存一段时长为10s的摄像头视频。具体代码如下:

import cv2

capture = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 打开笔记本内置摄像头
fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D') # 确定视频被保存后的编码格式
fps = 20 # 帧速率
# 创建VideoWriter类对象
output = cv2.VideoWriter("ten_Seconds.avi", fourcc, fps, (640, 480))
frame_Num = 10 * fps # 时长为10秒的摄像头视频含有的帧数
# 笔记本内置摄像头被打开且时长为10秒的摄像头视频含有的帧数大于0
while (capture.isOpened() and frame_Num > 0):
    retval, frame = capture.read() # 从摄像头中实时读取视频
    if retval == True: # 读取到摄像头视频后
        output.write(frame) # 在VideoWriter类对象中写入读取到的帧
        cv2.imshow("frame", frame) # 在窗口中显示摄像头视频
    key = cv2.waitKey(1) # 窗口的图像刷新时间为1毫秒
    frame_Num -= 1 # 时长为10秒的摄像头视频含有的帧数减少一帧
capture.release() # 关闭笔记本内置摄像头
output.release() # 释放VideoWriter类对象
cv2.destroyAllWindows() # 销毁显示摄像头视频的窗口

运行效果如图所示:

VideoWrite类不仅能保存摄像头视频,还能保存视频文件,而且保存视频文件与保存摄像头的步骤是相同的。

案例12:

保存视频文件。具体代码如下:

import cv2

video = cv2.VideoCapture("1.mp4") # 打开视频文件
fps = video.get(cv2.CAP_PROP_FPS) # 获取视频文件的帧速率
# 获取视频文件的帧大小
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D') # 确定视频被保存后的编码格式
output = cv2.VideoWriter("copy.avi", fourcc, fps, size) # 创建VideoWriter类对象
while (video.isOpened()): # 视频文件被打开后
    retval, frame = video.read() # 读取视频文件
    if retval == True: # 读取到视频文件后
        output.write(frame) # 在VideoWriter类对象中写入读取到的帧
    else:
        break
print("公司宣传.avi已经保存为PyCharm当前项目路径下的copy.avi。") # 控制台输出提示信息
video.release() # 关闭视频文件
output.release() # 释放VideoWriter类对象

运行效果如图所示:

案例13:

保存视频文件的前10s视频。

import cv2

video = cv2.VideoCapture("1.avi") # 打开视频文件
fps = video.get(cv2.CAP_PROP_FPS) # 获取视频文件的帧速率
# 获取视频文件的帧大小
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D') # 确定视频被保存后的编码格式
output = cv2.VideoWriter("ten_Seconds.avi", fourcc, fps, size) # 创建VideoWriter类对象
frame_Num = 10 * fps # 视频文件的前10秒视频含有的帧数
# 视频文件被打开后且视频文件的前10秒视频含有的帧数大于0
while (video.isOpened() and frame_Num > 0):
    retval, frame = video.read() # 读取视频文件
    if retval == True: # 读取到视频文件后
        output.write(frame) # 在VideoWriter类对象中写入读取到的帧
    frame_Num -= 1 # 视频文件的前10秒视频含有的帧数减少一帧
# 控制台输出提示信息
print("公司宣传.avi的前10s视频已经保存为PyCharm当前项目路径下的ten_Seconds.avi。")
video.release() # 关闭视频文件
output.release() # 释放VideoWriter类对象

 运行效果如图所示:


🚀4.总结

(1)读取并显示摄像头视频

🍀VideoCapture类

  • 构造方法VideoCapture()
  • isOpened()方法
  • read()方法
  • release()方法

🍀如何使用VideoCapture类

  • 读取并显示摄像头视频
  • 摄像头视频由彩色视频转换为灰度视频
  • 显示并保存摄像头视频某一刻的图像
  • 读取并显示两个摄像头视频

(2)播放视频文件

🍀读取并显示视频文件

  • video = cv2.VideoCapture(filename)

🍀视频的暂停播放和继续播放

🍀获取视频文件的属性

  • retval = cv2.VideoCapture.get(propID)

(3)保存视频文件

🍀VideoWrite类

  • 构造方法VideoWrite()
  • write()方法
  • release()方法

🍀如何使用VideoWrite类

  • 保存一段摄像头视频
  • 保存一段时长为10s的摄像头视频
  • 保存视频文件
  • 保存视频文件中的前10s视频

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/937978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-Python机器学习 - Unsupervised Learning函数

无监督学习 顾名思义,它与监督式机器学习方法或算法相反,这意味着在无监督的机器学习算法中,我们没有任何监督者可以提供任何类型的指导。在没有监督学习算法那样的自由的情况下,无监督学习算法非常方便,因为在这种情况下我们没有预先标签训练数据,而我们想从输入数据中提取有…

学信息系统项目管理师第4版系列03_文件与标准

审核未通过&#xff0c;删除文件部分&#xff0c;仅保留标准化相关内容&#xff0c;重发 12. 标准化 12.1. 采用国际标准和国外先进标准的程度分为等同采用、修改采用和等效采用 3 种 12.1.1. 【高21上选20】 12.1.2. 采用指与国际标准在技术内容和文本结构上相同,或者与国…

图的邻接矩阵与邻接表

目录 一、图的概念 二、邻接矩阵 2.1 邻接矩阵存储 2.2 邻接矩阵结构 2.3 构造邻接矩阵 2.4 边的添加 三、邻接表 3.1 邻接矩阵存储 3.2 邻接表结构 3.3 构造邻接表 3.4 边的添加 三、 图的遍历 一、图的相关概念 图是由顶点集合及顶点间的关系组成的一种数据结构&…

微服务dubbo

微服务是一种软件开发架构风格&#xff0c;它将一个应用程序拆分成一组小型、独立的服务&#xff0c;每个服务都可以独立部署、管理和扩展。每个服务都可以通过轻量级的通信机制&#xff08;通常是 HTTP/REST 或消息队列&#xff09;相互通信。微服务架构追求高内聚、低耦合&am…

Mybatis学习|第一个Mybatis程序

1.创建一个数据库以及一个用户表&#xff0c;并插入三条数据用来测试 2.创建一个空的maven项目 在pom.xml中导入本次测试用到的三个依赖&#xff0c;mysql驱动、mybatis依赖、以及单元测试junit依赖 将这个 空的maven项目当成一个父项目&#xff0c;再创建一个空的maven子项目用…

并发编程基础知识篇--进程和线程的区别

目录 进程和线程 进程 线程 进程与线程的区别总结 扩展小知识 程序计数器为什么是私有的? 虚拟机栈和本地方法栈为什么是私有的? 简单了解堆和方法区 多进程和多线程区别 Java中的多线程 进程和线程 进程 在一个操作系统中&#xff0c;每个独立执行的程序都可称之…

Linux操作系统--shell编程(运算符)

语法: "$((运算式))" 或 "$[运算式]" 下面我们介绍几种Linux操作系统中的运算符的使用方式: 方式1:这一个使用比较麻烦,不推荐使用 方式2:推荐使用

软考A计划-系统集成项目管理工程师-小抄手册(共25章节)-中

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

BUUCTF [SWPU2019]Web1

​ 这是一道sql二次注入题目&#xff0c;但是注入点并不在登录处 注册一个用户然后登录 广告申请处进行sql注入 你会发现过滤了很多关键字 空格#information等等 这里用到了一些绕过技巧 使用 /**/ 代替空格 union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,1…

【软件测试】Web自动化测试框架有哪些以及操作流程

测试行业现在70%是以手工测试为主&#xff0c;那么只有20%是自动化测试&#xff0c;剩下的10%是性能测试。 有人可能会说&#xff0c;我现在做手工&#xff0c;我为什么要学自动化呢&#xff1f;我去学性能更好性能的人更少&#xff1f; 其实&#xff0c;性能的要求比自动化要…

D - President - 背包dp

分析&#xff1a; 需要让所有x大于y的对应的z的总数大于z总共的数量的一半&#xff0c;找最小需要转化的数量&#xff0c;那么可以转化为01背包问题&#xff0c;z作为体积&#xff0c;每组的x和y都可以计算出一个值表示需不需要转化&#xff0c;作为背包价值&#xff0c;如果x大…

Java源码分析(二)Double

本篇是源码分析的第二篇&#xff0c;上篇我们一起分析了Integer类的源码&#xff0c;本篇一起学习下Double类的源码&#xff0c;看下其实现。 一、Double类图 首先&#xff0c;相比Integer&#xff0c;Double类的源码只有1000行代码。如下是Integer及其关联类/接口的类图&…

rke2 在线部署 kubernetes

文章目录 1. 还原虚拟机2. 背景3. 介绍4. 预备条件5.1 配置网卡5. 配置主机名 6. 配置互信7. 安装 ansible8. 系统初始化9. kube-master01 部署9.1 定制配置文件&#xff08;可选&#xff09;9.2 部署9.3 命令配置9.4 检查节点 10. 配置其他管理节点11. Agent 节点配置12. 检查…

Android 之 WallpaperManager (壁纸管理器)

本节引言&#xff1a; 本节给大家带来的是WallpaperManager(壁纸管理器)&#xff0c;如其名&#xff0c;就是手机壁纸相关的 一个API&#xff0c;在本节中我们会描述下WallpaperManager的基本用法&#xff0c;调用系统自带的 壁纸选择功能&#xff0c;将Activity的背景设置为壁…

openCV实战-系列教程8:直方图与均衡化(直方图定义/mask操作/均衡化原理/均衡化效果/自适应均衡化)、原理解析、源码解读

OpenCV实战系列总目录 打印图像直接用这个函数&#xff1a; import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()…

初阶数据结构(三)链表

&#x1f493;博主csdn个人主页&#xff1a;小小unicorn&#x1f493; ⏩专栏分类&#xff1a;c &#x1f69a;代码仓库&#xff1a;小小unicorn的学习足迹&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学习编程知识 前面我们讲的线性表的顺序存储结构。它…

2023年03月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;最佳路径 如下所示的由正整数数字构成的三角形: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 从三角形的顶部到底部有很多条不同的路径。对于每条路径&#xff0c;把路径上面的数加起来可以得到一个和&#xff0c;和最大的路径称为最佳路径。你的任务就是求出最佳路径上的…

天正(建筑、暖通、给排水、电气、结构)软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 天正软件是一款由天正集团开发的建筑工程设计软件&#xff0c;广泛应用于建筑设计领域。该软件旨在提供便捷、高效的建筑设计工具&#xff0c;帮助设计师快速创建高质量的建筑图纸。 以下是天正软件的主要特点&#xff1a; 支…

Spring注解之@validated的使用

使用步骤 1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 2.异常拦截类 /*** 全局异常处理*/ Slf…

二级MySQL(九)——表格数据处理练习

在Mysql中&#xff0c;可以用INSERT或【REPLACE】语句&#xff0c;向数据库中已一个已有的表中插入一行或多行记录。 在Mysql中&#xff0c;可以用【DELETE】或【TRUNCATE】语句删除表中的所有记录。 在Mysql中&#xff0c;可以用【UPDATE】语句来修改数据表中的记录。 为了完…