视频由一系列的图像构成这一系列的图像被称为帧,帧是以固定时间间隔从视频中获取的获取帧的速度被称为帧率及1s内出现的帧数,即FPS
若从视频中提取出独立的帧,则就可以使用图像处理方法对其进行处理,从而达到处理视频的的目的
1 VideoCapture类
1.1 类函数介绍
VideoCapture类的常用函数包括初始化,打开,帧捕获,释放,属性设置等,下面对其进行简单介绍
1.初始化 :
OpenCV为VideoCapture类提供了cv2.VideoCapture用于打开摄像头并完成摄像头初始化工作,其语法格式如下 :
cap = cv2.VideoCapture(摄像头ID号)
(1) .ID号为摄像头的ID号码,默认为-1,若有多个摄像头则随机选一个,一般情况下可选值为0,1,2,如果笔记本不外接摄像头的话,默认0应该就是笔记本的摄像头
(2) .捕获对象为返回值,是cv2.VideoCapture类的对象
同时,如果需要读取视频文件则可将参数换为视频文件的完整路径
2.cv2.VideoCapture.open()函数和cv2.VideoCapture.isOpened()函数 :
一般情况下,使用cap = cv2.VideoCapture()函数即可完成摄像头的初始化。又是为了防止初始化出现错误,可以使用cv2.VideoCapture.isOpened()函数来检测初始化是否成功
其语法格式为 :
retval = cv2.VideoCapture.isOpened()
(1) .如果成功则返回值为True,反之为False
如果摄像头初始化失败则可用cv2.VideoCapture.open(摄像头ID号)来再次打开摄像头
3.捕获帧 :
捕获帧所用函数为cv2.VideoCapture.read()函数,其语法格式为 :
retval,image = cv2.VideoCapture.read()
(1) . image是返回捕获到的帧,如果没有成功捕获,则该值为控
(2) . retval检测是否成功捕获,成功为True
4.释放 :
在不需要的时候则需要关闭摄像头,函数cv2.VideoCapture.release()用于此,其语法格式为 :
cv2.VideoCapture.release()
例如,当前有一VideoCapture对象cap要将其释放,则可以使用语句 : cap.release()
5.属性设置
有时,我需要获取cv2.VideoCapture对象的属性,或是更改该类对象的属性
cv2.VideoCapture.get()用于获取其对应属性,其语法格式为 :
retval = cv2.VideoCapture.get(propld)
(1) . propld对应这cv2.VideoCapture类对象的属性
例如 ,有一个cv2.VideoCapture类对象cvc,则
a . 可以通过cvc.get(cv2.CAP_PROP_FRAME_WIDTF)来获取当前帧对象的宽度
b . 可以通过cvc.get(cv2.CAP_PROP_FRAME_HEIGHT)来获取当前帧对象的高度
函数cv2.VideoCapture.set()用来设置cv2.VideoCapture类对象的属性,该函数语法为 :
retval = cv2.VideoCapture.set(propld,value)
(1) . propld对应cv2.VideoCapture类对象的属性
(2) . value即需要设定的属性值
其属性值及含义如下表 :
6.cv2.VideoCapture.grab()函数和cv2.VideoCapture.retrieve()函数
一般情况下如果读取一个摄像头的视频数据最简便的方法就是使用函数cv2.VideoCapture.read()
但是,如果需要同步一组或是一个多头摄像头的视频数据时则需要cv2.VideoCapture.grab()函数和cv2.VideoCapture.retrieve()函数来获取多个摄像头的数据。(实际上cv2.VoidCapture.read()可以理解为由cv2.VideoCapture.grab()函数和cv2.VideoCapture.retrieve()函数组成的)
函数cv2.VideoCapture.grab()用来指向下一帧其语法格式为 :
retval,image = cv2.VideoCapture.grab()
(1) . 如果函数成功指向下一帧,则返回值retval为True,反之为False
(2) . image为返回的视频帧,如果未成功则返回一个空图像
对与一组摄像头可使用 :
success0 = cameraCapture0.grab()
success1 = cameraCapture1.grab()
if success0 and success1 :
frame0 = cameraCapture0.retrieve()
frame1 = cameraCapture1.retrieve()
同样其也可以用来读取视频文件
1.2 捕获摄像头视频
简单例子:
from cv2 import cv2
# 调用usb摄像头
cap = cv2.VideoCapture(0)
# 设置视频帧宽高
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
# 显示
while (cap.isOpened()):
ret, frame = cap.read()
cv2.imshow("window",frame)
if cv2.waitKey(1)&0xFF == ord("q"):
break
# 关闭
cap.release()
cv2.destroyAllWindows()
1.3 播放视频文件
同上例,可以通过waitKey()中参数设置FPS从而达到慢放的结果
2 VideoWriter类
OpenCV中的cv2.VideoWriter()类可以将图片序列保存为视频文件,也可以修改视频的各种属性,还可以完成对视频类型的转换
2.1 类函数介绍
1.构造函数
OpenCV为cv2.VideoWriter类提供构造函数,用它来实现初始化工作。其语法格式为 :
VideoWriterobject = cv2.VideoWriter(filename,fourcc,fps,frameSize,isColor)
(1) . filename为目标视频的完整路径
(2) . fourcc为视频编码类型(格式)
在OpenCV中用函数cv2.VideoWriter_fourcc()来指定视频编码格式,其有4个字符参数。这4个字符参数构成了编/解码器的"四字标记"每个编/解码器都有一个这样的标记,下面列出几个常用的标记 :
a. cv2.VideoWriter_fourcc(‘I’,‘4’,‘2’,‘0’)表示未压缩的 YUV 颜色编码格式,色度子采样为 4:2:0。该编码格式具有较好的兼容性,但产生的文件较大,文件扩展名为.avi。
b . cv2.VideoWriter_fourcc(‘P’,‘I’,‘M’,‘I’)表示 MPEG-1 编码类型,生成的文件的扩展名为.avi。
c . cv2.VideoWriter_fourcc(‘X’,‘V’,‘I’,‘D’)表示 MPEG-4 编码类型。如果希望得到的视频大小为平均值,可以选用这个参数组合。该组合生成的文件的扩展名为.avi。
d . cv2.VideoWriter_fourcc(‘T’,‘H’,‘E’,‘O’)表示 Ogg Vorbis 编码类型,文件的扩展名为.ogv。
e . cv2.VideoWriter_fourcc(‘F’,‘L’,‘V’,‘I’)表示 Flash 视频,生成的文件的扩展名为.flv。
若还想了解更多则可以去 http://www.fourcc.org上查询
若将fourcc置为-1则会在执行时会弹出一个对话框,可以根据自己的需要选择压缩程序和压缩质量
(3) . fps为帧速率
(4) . frameSize为每一帧的长和宽
(5) . isColor表示是否为彩色图像
例如 :
fourcc = -1
out = cv2.VideoWriter('output.avi',fourcc,20,(1024,768))
# 通过对话设置编/解码格式
2.write函数
cv2.VideoWriter类中的函数cv2.VideoWriter.write()用于写入下一帧的视频。该函数的语法格式为 :
cv2.VideoWriter.write(img)
(1) . 式中img为要写入的视频帧。通常情况下为BGR模式
例如,有一个视频帧frame要写入名为out的cv2.VideoWriter对象中,则使用语句 : out
.write(frame)
3.释放
在不需要cv2.VideoWriter类对象时需要将其释放,用到的函数为 : cv2.VideoWriter.release(),其语法格式为 :
cv2.VideoWriter.release()
例如当前有一cv2.VideoWriter对象out,则out.release()可以将其释放
2.2 保存视频
保存视频包括创建对象、写入视频、释放对象等多个步骤,下面对各个步骤做简单介绍
1.创建对象
在创建对象前应设置好参数。
(1) . 设置好具体的文件名,例如 : filename = ‘output.avi’
(2) . 使用cv2.VideoWriter_fourcc()确定编/解码的类型例如 : fourcc = cv2.VideoWriter_fourcc(*‘XVD’)
(3) . 确定视频的帧速率如 : fps = 20
(4) . 确定视频的长和宽,例如 : size = (640,480)
然后利用上述参数创建对象,例如 :
out = cv2.VideoWriter(filename,fource,fps,size)
当然也可以直接将参数输入到里面进行创建
2.写入视频
比如,将创建的对象out内写入读取到的视频帧frame :
out,write(frame)
3.释放对象
out.release()
完整代码 :
from cv2 import cv2 as cv
import numpy as np
# 开启摄像头
cap = cv.VideoCapture(0)
# 确定编/解码的类型
fourcc = cv.VideoWriter_fourcc('I','4','2','0')
# 创建对象并设置参数
out = cv.VideoWriter('output.avi',fourcc,20,(640,480))
while(cap.isOpened()):
# 读取视频帧
ret,frame = cap.read()
if ret == True:
# 写入视频帧
out.write(frame)
# 显示
cv.imshow('frame',frame)
# esc退出
if cv.waitKey(1) == 27 :
break
else:
break
# 释放并关闭窗口
cap.release()
out.release()
cv.destroyAllWindows()
运行上述程序,程序就会捕获当前摄像头的视频内容,并将其保存在当前目录下的名为"output.avi"的视频文件中。
3 视频操作基础
此处以Canny边缘检测为例
# 提取视频的Canny边缘检测结果
import numpy as np
from cv2 import cv2 as cv
cap = cv.VideoCapture('viptrain.avi')
while(cap.isOpened):
ret,frame = cap.read()
frame = cv.Canny(frame,100,200)
cv.imshow('frame',frame)
if cv.waitKey(1) == 27:
break
cap.release()
cv.destroyAllWindows()
运行程序即会播放对应视频的Canny边缘检测效果。
本文参考自 : 李立宗《OpenCV轻松入门 : 面向Python》