欢迎来到军工软件开发人才培养基地——学到牛牛

OpenCV对视频的操作

时间:2024-05-06 07:01:10 来源:学到牛牛

视频是由一系列图像构成,这一系列图像被称为帧,帧是以固定的时间间隔从视频中获取的。

播放的速度称为帧速率,其单位通常使用“帧/秒”表示,代表在1秒内所出现的帧数。

如果从视频中提出独立的帧,就可以使用图像处理的方法对其进行处理,达到处理视频的目的。

OpenCV提供了cv2.VideoCapture类和cv2.VideoWriter类来支持各种类型的视频文件。

1、打开视频文件

1)初始化

cv2.VideoCapture类可以处理指定路径的视频,也可以处理摄像头信息。

OpenCV为VideoCapture类提供了构造函数cv2.VideoCapture(),用于打开摄像头并完成摄像头的初始化工作。

语法格式如下:

video = cv2.VideoCapture(param)

 

param为初始化参数,常见参数,可用数字“0”,表示使用第1个摄像头,数字“1”表示第2个摄像头,以此类推;如参数为视频文件路径,表示处理指定视频文件。

 

2)验证初始化是否成功

一般情况下,使用cv2.VideoCapture()函数即可完成摄像头的初始化。

有时,为了防止初始化发生错误(视频读取失败情况),可以使用函数cv2.VideoCapture.isOpened()来检查初始化是否成功。

该函数的语法格式为:

isOpened = cv2.VideoCapture.isOpened()

 

该函数会判断当前的摄像头|视频是否初始化成功。如果成功,则返回值为True,否则为False。

 

3)捕获帧

摄像头初始化成功后,就可以从摄像头中捕获帧信息。

捕获帧所使用的函数是cv2.VideoCapture.read()。

该函数的语法如下:

b, image = cv2.VideoCapture.read()

 

image是返回捕获到的帧,如果没有帧被捕获,则该值为空;

b表示捕获是否成功,如果成功则该值为True,不成功则为False。

 

4)释放

在不需要摄像头|视频时,要关闭及时摄像头。关闭摄像头使用的是函数cv2.VideoCapture.release()。

该函数的语法是:

cv2.VideoCapture.release()

 

5)读取指定视频案例

读取本地视频,并在图像窗口中展示。

import cv2

 

# 1、初始化;返回VideoCapture类型

video = cv2.VideoCapture("video/智能家居广告.mp4")

 

# 2、验证视频是否打开

isOpened = video.isOpened()

 

while isOpened:

    # 3、每一次循环,读取一帧,返回元组

    b, img = video.read()

    if b:

        # 使用图像方式打开视频

        cv2.imshow("", img)

        # 正常视频1秒30帧,高清视频1秒48秒

        cv2.waitKey(30)

# 4、释放资源

video.release()

 

 

2、属性设置

函数cv2.VideoCapture.get()用于获取CideoCapture类对象的属性。

常见属性如下所示:

cv2.CAP_PROP_FRAME_WIDTH   表示获取视频宽度,等同 cv2.VideoCapture.get(3)

cv2.CAP_PROP_FRAME_HEIGHT   表示获取视频高度,等同 cv2.VideoCapture.get(3)

cv2.CAP_PROP_FPS             表示获取视频帧率,等同 cv2.VideoCapture.get(5)

cv2.CAP_PROP_FRAME_COUNT   表示获取视频帧数,等同 cv2.VideoCapture.get(7)

 

案例1:获取VideoCapture类常用属性

import cv2

 

video = cv2.VideoCapture("video/智能家居广告.mp4")

 

# 获取帧的宽度(即:图像宽度)

print(video.get(cv2.CAP_PROP_FRAME_WIDTH))    

print(video.get(3))   

# 帧的高度(即:图像的高度)

print(video.get(cv2.CAP_PROP_FRAME_HEIGHT))  

# 帧率,即视频的速度,帧率越高视频也高清晰,帧率越低视频越不清晰

print(video.get(cv2.CAP_PROP_FPS))    

# 帧数(即图片数量),视频时长 = 帧数 / 帧率        

print(video.get(cv2.CAP_PROP_FRAME_COUNT))    

 

video.release()

 

3、保存视频

OpenCV中cv2.VideoWriter类可以将图片序列保存成视频文件,也可以修改视频各种属性,还可以完成对视频类型的转换。

OpenCV为cv2.VideoWriter类提供了构造函数,用它来实现初始化工作。

该函数的语法格式如下所示:

<VideoWriter object> = cv2.VideoWriter(filename, fourcc, fps, frameSize [, isColor]) 

 

filename:指定输出目标视频的存放路径和文件名。如果指定的文件名已经存在,则会覆盖这个文件。

fourcc:表示视频编码、解码类型。

在OpenCV中用函数cv2.VideoWriter_fourcc()来指定视频编码格式。cv2.VideoWriter_fourcc()有4个字符参数。

几个常用的标记:

cv2.VideoWriter_fourcc("M", "P", "4", "V")该编码格式生成的文件的扩展名为.map4。

cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')表示MPEG-4编码类型,该组合生成的文件的扩展名为.avi。

cv2.VideoWriter_fourcc('T', 'H', 'E', 'O')表示Ogg Vorbis编码类型,文件的扩展名为.ogv。

fps:为帧速率。

frameSize:为每一帧的长和宽。

isColor:表示是否为彩色图像。

 

案例1:将视频进行处理后,保存成一个新视频

import cv2

 

# 初始化;返回VideoCapture类型

video = cv2.VideoCapture("video/智能家居广告.mp4")

 

# 获取视频的宽高

width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))

height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))

 

# 设置输出视频格式。注意:frameSize参数需要int类型

out = cv2.VideoWriter("video_output/1.mp4", cv2.VideoWriter_fourcc("M", "P", "4", "V"), 30, (width, height))

 

# 验证视频是否打开

isOpened = video.isOpened()

 

while isOpened:

    # 每一次循环,读取一帧,返回元组

    b, img = video.read()

    if b:

        # 取消红色通道

        b, g, r = cv2.split(img)

        r[:, :] = 0

        # 生成新的图像

        img2 = cv2.merge(mv=(b, g, r))

 

        # 将图片保存成视频

        out.write(img2)

    else:

        break

# 释放资源

out.release()

video.release()

 

运行时会出现OpenCV: FFMPEG: tag 0x5634504d/'MP4V' is not supported with codec id 13 and format 'mp4 / MP4 (MPEG-4 Part 14)'错误,该错误可以忽略,是因为IDEA没有权限打开播放器导致。

 

需要注意,使用cv2.VideoWriter()保存视频,只能保存图像,不能保存声音。