OpenCV基础知识(9)— 视频处理(读取并显示摄像头视频、播放视频文件、保存视频文件等)
前言: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 cv2capture = 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 cv2capture = 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 cv2cap = 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 cv2cap_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 cv2video = cv2.VideoCapture("1.mp4") # 打开视频文件
while (video.isOpened()): # 视频文件被打开后retval, image = video.read() # 读取视频文件# 设置“Video”窗口的宽为420,高为300cv2.namedWindow("Video", 0)cv2.resizeWindow("Video", 420, 300)if retval == True: # 读取到视频文件后cv2.imshow("Video", image) # 在窗口中显示读取到的视频文件else: # 没有读取到视频文件breakkey = cv2.waitKey(1) # 窗口的图像刷新时间为1毫秒if key == 27: # 如果按下Esc键break
video.release() # 关闭视频文件
cv2.destroyAllWindows() # 销毁显示视频文件的窗口
运行效果如图所示:
说明:♨️♨️♨️
调整waitKey()方法中的参数值可以控制视频文件的播放速度。例如,当cv2.waitKey(1)时,视频文件的播放速度非常快;当cv2.waitKey(50)时,就可以减缓视频文件的播放速度。
使用图像处理的相关方法可以把摄像头视频由彩色视频转换为灰度视频。那么,使用相同的方法,也能够将视频文件由彩色视频转换为灰度视频。
案例6:
将视频文件由彩色视频转换为灰度视频。具体代码如下所示:
import cv2video = cv2.VideoCapture("1.mp4") # 打开视频文件
while (video.isOpened()): # 视频文件被打开后retval, img_Color = video.read() # 读取视频文件# 设置“Video”窗口的宽为420,高为300cv2.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: # 没有读取到视频文件breakkey = cv2.waitKey(1) # 窗口的图像刷新时间为1毫秒if key == 27: # 如果按下Esc键break
video.release() # 关闭视频文件
cv2.destroyAllWindows() # 销毁显示视频文件的窗口
运行效果如图所示:
💥💥2.2 视频的暂停播放和继续播放
上述案例已经实现了在窗口中播放视频文件的效果。那么,能否在此基础上,通过按键指令,在播放视频的过程中,实现视频的暂停播放和继续播放呢?答案肯定是可以的了!✅
案例7:
视频的暂停播放和继续播放。当按下空格键的时候,暂停播放视频;当再次按下空格键的时候,继续播放视频;当按下【Esc】键时,关闭视频文件并销毁显示视频文件的窗口。
具体代码如下所示:
import cv2video = cv2.VideoCapture("1.mp4") # 打开视频文件
while (video.isOpened()): # 视频文件被打开后retval, image = video.read() # 读取视频文件# 设置“Video”窗口的宽为420,高为300cv2.namedWindow("Video", 0)cv2.resizeWindow("Video", 420, 300)if retval == True: # 读取到视频文件后cv2.imshow("Video", image) # 在窗口中显示读取到的视频文件else: # 没有读取到视频文件breakkey = 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_FORMAT | retrieve()方法返回的Mat对象的格式 |
cv2.CAP_PROP_MODE | 指示当前捕获模式的后端专用的值 |
cv2.CAP_PROP_CONVERT_RGB | 指示是否应将图像转换为RGB |
说明:♨️♨️♨️
1.视频是由大量的、连续的图像构成的,把其中的每一幅图像称作一帧。
2.帧数指的是视频文件中含有的图像总数,帧数越多,视频播放时越流畅。
3.在播放视频的过程中,把每秒显示图像的数量称作帧速率(FPS,单位:帧/s)
4.帧的宽度指的是图像在水平方向上含有的像素总数。
5.帧的高度指的是图像在垂直方向上含有的像素总数。
案例8:
获取并输出视频文件的指定属性值。具体代码如下:
import cv2video = 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 cv2video = 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,高为300cv2.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: # 没有读取到视频文件breakkey = 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 cv2capture = 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 cv2capture = 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 cv2video = 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 cv2video = 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视频
相关文章:
OpenCV基础知识(9)— 视频处理(读取并显示摄像头视频、播放视频文件、保存视频文件等)
前言:Hello大家好,我是小哥谈。OpenCV不仅能够处理图像,还能够处理视频。视频是由大量的图像构成的,这些图像是以固定的时间间隔从视频中获取的。这样,就能够使用图像处理的方法对这些图像进行处理,进而达到…...
PostgreSQL命令行工具psql常用命令
1. 概述 通常情况下操作数据库使用图形化客户端工具,在实际工作中,生产环境是不允许直接连接数据库主机,只能在跳板机上登录到Linux服务器才能连接数据库服务器,此时就需要使用到命令行工具。psql是PostgreSQL中的一个命令行交互…...
【CSS 画个梯形】
使用clip-path: polygon画梯形 clip-path: polygon使用方式如下: 效果实现 clip-path: polygon 是CSS的属性之一,用于裁剪元素的形状。它可以通过定义一个具有多边形顶点坐标的值来创建一个多边形的裁剪区域,从而实现元素的非矩形裁剪效果。…...
Spring Data Redis
文章目录 Redis各种Java客户端Spring Data Redis使用方式操作字符串类型的数据操作哈希类型数据列表类型集合类型有序集合类型通用类型 Redis各种Java客户端 Java中如何操作redis,这里主讲IDEA中的框架Spring Data Redis来操作redis Jedis是官方推出的,…...
软件测试的方法有哪些?
软件测试 根据利用的被测对象信息的不同,可以将软件测试方法分为:黑盒测试、灰盒测试、白盒测试。 1、白盒测试 1)概念:是依据被测软件分析程序内部构造,并根据内部构造分析用例,来对内部控制流程进行测试…...
Python Qt学习(二)Qt Designer
一开始以为Designer是个IDE,多番尝试之后,发现,是个UI设计工具,并不能在其中直接添加代码。保存之后,会生成一个后缀是UI的文件,再用pyuic5.exe将ui文件转化成py文件。pyuic5 -o 目标py文件 源ui文件...
我的数据上传类操作(以webDAV为例)
在登录处进行初始化: 1.读取配置 GModel.ServerSetin JsonToIni.GetClass<ServerSet>(ConfigFiles.ConfigFile);if (!string.IsNullOrWhiteSpace(GModel.ServerSetin.FTPUser)){OPCommon.NetControls.NetworkShareConnect.connectToShare(GModel.ServerSeti…...
move与函数指针的简单使用
std::move() C11的标准库 提供了一个非常有用的函数 std::move(),std::move() 函数将一个左值强制转化为右值引用,以用于移动语义。 就是说 std::move(str); 之后原来的值因为变成了右值失效了 但是这样赋值可以避免出现拷贝 #include <iostream&g…...
第五章 树与二叉树 二、二叉树的定义和常考考点
一、定义 二叉树可以用以下方式详细定义: 二叉树是由节点构成的树形结构,每个节点最多可以有两个子节点。每个节点有以下几个属性: 值:存储该节点的数据。左子节点:有一个左子节点,如果没有则为空。右子节…...
算法笔记/USACO Guide GOLD金组DP 1. Introduction to DP
USACO Guide中金组的内容分为一下六个章节 DP数学图论数据结构树一些附加主题 今天学习DP,以下内容: 初入DP背包DP图表中的路线最长递增序列状态压缩DP区间DP数位DP 初入DP Dynamic Programming (DP) is an important algorithmic technique in Comp…...
天锐绿盾安全U盘系统
安全U盘系统 01 简介 天锐绿盾安全U盘系统,是一款致力于保障U盘数据内容安全的产品。通过严格身份认证、便捷安全的密保机制、智能的U盘锁定或自毁设置、详细的文件操作日志、文件粉碎、设置还原等,天锐绿盾安全U盘系统为您U盘的数据保驾护航࿰…...
灰色预测模型
当谈论灰色预测时,通常是指灰色系统理论,它是一种用于处理少量数据或缺乏充分信息的情况下进行预测和分析的数学方法。灰色预测的核心思想是通过建立灰色模型来分析和预测数据的变化趋势。 我会解释灰色预测的基本原理、步骤和方法: 1. 灰色…...
Yolo系列-yolov1
YOLO-V1 经典的one-stage方法 YouOnlyLookOnce,名字就已经说明了一切!把检测问题转化成回归问题,一个CNN就搞定了!可以对视频进行实时检测,应用领域非常广! 核心思想: Yolov1的核心思想是将对象…...
单片机TVS/ESD二极管防护
TVS 瞬态电压抑制二极管Transient Voltage Suppressor ESD 静电释放二极管 Electro-Static discharge 这两种本质上都是二极管。都是利用了二极管正向导通、反向截止的特性。二极管在反向截止截止条件下,如果电压继续增大,将会引发雪崩,使得…...
TCP协议的重点知识点
TCP协议的重点知识点 TCP(传输控制协议)是一种面向连接、可靠的数据传输协议,工作在传输层,提供可靠的字节流服务。它是互联网协议栈中最重要、最复杂的协议之一,也是面试中常被问到的知识点。本文将详细介绍TCP协议的各个重要概念。 TCP基本特性 TCP主要具有以下基本特性: …...
大数据——一文熟悉HBase
1、HBase是什么 HBase是基于HDFS的数据存储,它建立在HDFS文件系统上面,利用了HDFS的容错能力,内部还有哈希表并利用索引,可以快速对HDFS上的数据进行随时读写功能。 Hadoop在已经有一个HiveMapReduce结构的数据读写功能&#x…...
如何有效进行RLHF的数据标注?
编者按:随着大语言模型在自然语言处理领域的广泛应用,如何从人类反馈进行强化学习(RLHF)已成为一个重要的技术挑战。并且RLHF需要大量高质量的人工数据标注,这是一个非常费力的过程。 本文作者在数据标注领域具有丰富经…...
2023年8月22日OpenAI推出了革命性更新:ChatGPT-3.5 Turbo微调和API更新,为您的业务量身打造AI模型
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
windows配置wsl,Unbuntu启动GPU加速
wsl全称Windows Subsystem for Linux,windows电脑下的linux子系统,对于想用Linux的Windows用户来说wsl是一个不错的选择。 安装wsl 两种方法可以安装wsl,这个默认安装在C盘。 方法一运行命令安装 wsl --install方法二,在windo…...
Postman测WebSocket接口
01、WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直…...
【内网穿透】搭建我的世界Java版服务器,公网远程联机
目录 前言 1. 搭建我的世界服务器 1.1 服务器安装java环境 1.2 配置服务端 2. 测试局域网联机 3. 公网远程联机 3.1 安装cpolar内网穿透 3.1.1 windows系统 3.1.2 linux系统(支持一键自动安装脚本) 3.2 创建隧道映射内网端口 3.3 测试公网远程…...
Unable to Locate package python2| Linux Ubuntu系统下python2的安装
Linux Ubuntu系统下python2的安装 FSL的安装脚本是用Python2写的,新版本的Ubuntu (16以后)在默认情况下没有安装Python2。在终端输入 python2,若提示没有相应的命令,则需要先安装Python2,如下指令…...
从上帝视角俯瞰vue2路由(简单易懂)
文章目录 路由原理(hash)路由安装和使用(vue2)路由跳转路由的传参和取值嵌套路由路由守卫完整代码 路由原理(hash) 单页应用的路由模式有两种 哈希模式(利用hashchange 事件监听 url的hash 的…...
STL-空间配置器的了解
前言 空间配置器,顾名思义就是为了各个容器高效的管理空间(空间的申请与回收)的,在默默的工作的。虽然在常规上使用STL时,可能用不上它,但是站在学习研究的角度,学习它的实现原理对我们有很大的…...
哔哩哔哩 B站 bilibili 视频视频音效调节 清澈人声
视频音效调节方式:直接视频播放内容界面内鼠标右键点击视频音效调节 注意:需要使用的是谷歌浏览器,我的火狐浏览器试了不行,都没选项,火狐的出来的界面是这样的: 目录 具体操作如下: 1、谷歌…...
下一代存储解决方案:湖仓一体
文章首发地址 湖仓一体是将数据湖和数据仓库相结合的一种数据架构,它可以同时满足大数据存储和传统数据仓库的需求。具体来说,湖仓一体可以实现以下几个方面的功能: 数据集成: 湖仓一体可以集成多个数据源,包括结构…...
IntelliJ IDEA 2023.2.1 修复版本日志
我们刚刚发布了 v2023.2 的第一个错误修复更新。 您可以从 IDE 内部、使用工具箱应用程序或通过快照(如果您使用的是 Ubuntu)更新到此版本。您也可以直接从我们的网站下载。 以下是最新版本中包含的最值得注意的改进和修复的列表: 我们已经解…...
算法通关村十三关 | 数组字符串加法专题
1. 数组实现整数加法 题目:LeetCode66,66. 加一 - 力扣(LeetCode) 思路 我们只需要从头到尾依次运算,用常量标记是否进位,需要考虑的特殊情况是digits [9,9,9]的时候进位,我们组要创建长度加1…...
k8s--基本概念理解
必填字段 在要创建的 Kubernetes 对象的文件中.yaml,您需要设置以下字段的值: apiVersion- 您使用哪个版本的 Kubernetes API 创建此对象 kind- 你想创建什么样的对象 metadata- 有助于唯一标识对象的数据,包括name字符串、UID和可选namesp…...
流媒体开发千问【持续更新】
H.264中IDR帧和I帧区别 H.264/AVC编码标准中,IDR帧和I帧都是关键帧,即它们都不依赖于其他帧进行解码。但是,它们之间存在明确的区别: 定义与功能: I帧(Intra-frame):I帧是一个内部编…...
wordpress+smart/关键词排名怎么上首页
交换变量的值 let x 1; let y 2;[x, y] [y, x]; 从函数返回多个值 函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。 // 返回一个数组function example() {return [1, 2, 3]; }…...
给菠菜网站做支付/香港头条新闻
1) 质量是价值的体现、是公司的生存之道。 2) 软件质量是企业生命线、产品的生命线。持续优化、持续改进 3) 软件质量管理是一个长期进化的历程,没有止境唯有更好,企业能走多远质量管理就有多严 4) 质量是一个系统工程,短时间很难看到成效,持续改进是最好的方法。 5) 团队时刻关…...
广州最新今天的消息/seo的名词解释
黑客技术点击右侧关注,了解黑客的世界!推荐↓↓↓ 长按关注?【16个技术公众号】都在这里!涵盖:程序员大咖、源码共读、程序员共读、数据结构与算法、黑客技术和网络安全、大数据科技、编程前端、Java、Python、Web编程开发、Andr…...
广州企业网站建设哪家服务好/seo排名优化教程
注意事项需引入以下4项!!!import XLSX from xlsximport FileSaver from file-saverimport xlsxStyle from xlsx-style;import XSU from ./xlsxStyle.utils;// XLSX 、FileSaver 、xlsxStyle 都可以直接npm下载(引入1、2、3可npm下载)引入1:import XLSX from xlsx引入…...
b2b电子商务网站分类/seo是哪个英文的简写
引言概率密度期望和协方差 Expectations and covariances1加权平均值2 多变量权重3 条件期望4 函数方差5 协方差 Bayesian Probability5高斯分布重回多项式拟合1理解误差函数2 理解规则化 贝叶斯曲线拟合 主要讲解了贝叶斯概率与统计派概率的不同。概率论,决策论&am…...
国际足联世界排名/青岛seo
List是一个接口,而ListArray是一个类。 ListArray继承并实现了List。 所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造。 List list; //正确 listnull; List listnew List(); // 是错误的用法…...