一、读取视频
读取视频文件与在OpenCV中读取图像文件非常相似,区别在于我们使用了cv2.videocapture。
1.1读取视频需要用到的函数
视频写入函数 cv.VideoWriter()
读取视频 cv.VideoCapture.read()
写入视频 cv.VideoWriter.write(frame)
打开,判断是否打开isOpened () open()
获取参数,更改参数 cv.VideoCapture.get(propId) cv.VideoCapture.set(propId, value)
释放视频 cv.VideoCapture.release()
————————————————
VideoCapture参数可以选择文件路径,例如:cv2.VideoCapture('test_video.mp4')
isOpened()判断是否打开,cv.VideoCapture.open用来打开一段视频流,例如:cv.VideoCapture.open('test_video.mp4'),如果设备或者视频被打开,则会返回true
————————————————
1 import cv2 2 import matplotlib.pyplot as plt 3 import numpy as np 4 5 6 vc = cv2.VideoCapture(r'C:\Users\19225\PycharmProjects\test\src\user\media\1.mp4') 7 # 检查视频是否打开正确 8 if vc.isOpened(): 9 open, frame = vc.read() 10 else: 11 open = False 12 13 # 逐帧读取和处理视频 14 while open: 15 # ret表示帧是否被正确读取,frame读取到的帧 16 ret, frame = vc.read() 17 if frame is None: 18 break 19 if ret == True: 20 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 21 cv2.imshow('result', gray) 22 # 等待100秒,用户摁q键退出 23 if cv2.waitKey(100) & 0xFF == ord('q'): 24 break 25 # 释放资源和关闭窗口q 26 vc.release() 27 cv2.destroyAllWindows()
二、从摄像头获取视频
1 # 创建VideoCapture对象,用创建的对象去做之后的操作 2 cap = cv2.VideoCapture(0) 3 # 检测有无摄像头正常使用 4 # 这是一个必要的验证,当cap为空的时候,后续调用会报错。 5 if not cap.isOpened(): 6 print("Cannot open camera") 7 exit() 8 9 # 获取视频流是一个连续的循环过程,一直在获取,不是说获取到一帧就可以了 10 while True: 11 # 通过创建的VideoCapture对象逐帧获取视频,会返回两个参数,ret返回true和false代表是否正常获取到帧,以及视频是否结束 12 # frame代表获取到的帧 13 ret, frame = cap.read() 14 # if frame is read correctly ret is True 15 if not ret: 16 print("不能正常读取视频帧") 17 break 18 # 将获取到的视频帧,也就是一幅幅图像,转为灰度图 19 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 20 # 展示 21 cv2.imshow('frame', gray) 22 # q退出获取视频流 23 if cv2.waitKey(1) == ord('q'): 24 break 25 # 释放资源 26 cap.release() 27 cv2.destroyAllWindows()
三、通过opencv获取视频设备的参数,设置新参数
cv.VideoCapture.get( propId )
获取设备参数,propld填写cv2提供的参数选项,官网提供了70种可以查询的参数。返回值就是改参数的值,如果查询的参数不存在或者不支持,不报错,会返回0 。
1 import cv2 as cv 2 3 # 创建VideoCapture对象,用创建的对象去做之后的操作 4 cap2 = cv.VideoCapture(0) 5 6 while True: 7 # 获取设备参数,cv.CAP_PROP_FRAME_WIDTH,CAP_PROP_FRAME_HEIGHT是cv2提供的参数选项 8 width, height = cap2.get(cv.CAP_PROP_FRAME_WIDTH), cap2.get(cv.CAP_PROP_FRAME_HEIGHT) 9 # 我这里是1280.0 720.0 10 print(width, height) 11 12 # 以原分辨率的两倍来捕获 13 cap2.set(cv.CAP_PROP_FRAME_WIDTH, width * 2) 14 cap2.set(cv.CAP_PROP_FRAME_HEIGHT, height * 2) 15 _, frame2 = cap2.read() 16 17 gray_double = cv.cvtColor(frame2, cv.COLOR_BGR2GRAY) 18 # 展示 19 cv.imshow('doubel read', gray_double) 20 # q退出获取视频流 21 if cv.waitKey(1) == ord('q'): 22 break 23 # 释放资源 24 cap2.release() 25 cv.destroyAllWindows()
四、录制视频并保存
1.定义编码方式,创建VideoWriter对象,有五个参数,VideoWriter (const String &filename, int fourcc, double fps, Size frameSize, bool isColor=true)分别是:
输出的文件名,如’output.avi’
编码方式FourCC码
帧率FPS
要保存的分辨率大小
最后一个是isColor标志。如果它是 “True”,编码器就会期待彩色帧,否则就会使用灰阶帧。
2.定义一个VideoCapture
3.执行写入函数将VideoCapture捕获的内容按照设定好的方式写入指定位置
知识点补充
视频编码
是将视频信号转换为数字信号的过程,以便在数字媒体设备上存储和传输。
常见编码方式有
1 H.264:H.264是一种广泛使用的视频编码标准,也称为AVC(Advanced Video Coding)。它支持高质量视频压缩,并可提供高清晰度视频和流媒体。 2 H.265:H.265,也称为HEVC(High Efficiency Video Coding),是一种新的视频编码标准,它比H.264提供更高的压缩比和更好的图像质量。 3 MPEG-2:MPEG-2是一种广泛使用的视频编码标准,用于数字电视、DVD和蓝光光盘等高清晰度视频。 4 MPEG-4:MPEG-4是一种支持视频、音频和多媒体内容的编码标准,也用于流媒体和网络视频。 5 VP9:VP9是一种由Google开发的视频编码标准,它提供比H.264更好的压缩效率和图像质量,并支持4K和8K视频。 6 AV1:AV1是一种由Alliance for Open Media开发的新一代开放视频编码标准,旨在提供更高的压缩效率和更好的图像质量。 7 8 FourCC是一种用于标识视频编解码器的四个字符代码,通常由四个大写字母组成,用于标识视频解码器和编码器。例如,MPEG-4视频格式的FourCC代码是“MP4V”,H.264视频格式的FourCC代码是“H264”。FourCC代码的好处是在视频编辑和处理软件中,可以选择正确的解码器,从而确保视频文件可以正确地播放和编辑,并且在不同的平台和应用程序之间进行交互。 9 ————————————————