一、视频处理
opencv不仅能够处理图像,还能够处理视频,视频是由大量的图像构成的,这些图像是以固定的时间间隔从视频中获取的,这样就能够使得图像处理的方法对这些图像进行处理,进而达到处理视频的目的,要想处理视频,需要对视频就行读取,显示,保存等相关操作,为此,opencv提供了VideoCapture类和VideoWriter类的相关方法。
1、读取并显示摄像头视频
摄像头视频指的是从摄像头中实时读取到的视频,为了读取并显示摄像头视频,opencv提供了VideoCapture类的相关方法,这些方法包括摄像头的初始化方法,检验摄像头初始化是否成功的方法,从摄像头读取侦的方法,关闭摄像头的方法等。视频由大量的图像构成,把这些图像称为帧
VideoCapture类提供了构造方法VideoCapture(),用于完成摄像头的初始化工作。
capture = cv2.VideoCapture(index)
capture属性说明在文章最后
capture:要打开的摄像头
index:摄像头的设备索引
摄像头的数量及设备索引的先后顺序由操作系统决定,并且opencv没有提供查询摄像头数量及设备索引的方法。
当index的值为0时,表示要打开的是第一个摄像头,对于64位的windows10笔记本,当index的值为0时,表示要打开的笔记本内置摄像头。
capture=cv2.VideoCapture(0)
当index的值为1时,表示要打开的是第2个摄像头,对于64位的windows10笔记本,当index的值为1时,表示要打开的是一个连接笔记本的外置摄像头
capture=cv2.VideoCapture(1)
为了检验摄像头初始化是否成功,VideoCapture类提供了isOpened()方法,isOpened()方法语法:
retval=capture.isOpened()
retval:isOpened()方法的返回值,如果摄像头初始化成功,retval值为True,否则,retval的值为False。
摄像头初始化后,就可以从摄像头中读取侦了,为此VideoCapture类提供了read()方法,read()方法的语法格式如下:retval,image = capture.read()
retval:是否读取到侦,如果读取到侦,retval的值为True,否则,retval的值为False
image:读取到的侦,因为侦指的是构成视频的图像,所以可以把 “读取到的侦”理解为读取到的图像。
opencv在官网中特别强调,在不需要摄像头时,要关闭涉嫌头,为此,VideoCapture类提供了release()方法,capture.release()。
我们读取并显示摄像头视频,那么如何对这个视频进行处理呢,其实,处理视频所用的方法与处理图像所用的方法时相同的。
举例子:读取笔记本摄像头视频,关闭笔记本内置摄像头,销毁显示摄像头视频的窗口并处理视频,将视频转灰度图像显示。
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.namedWindow("grayVideo",0)#定义窗口名
cv2.resizeWindow("grayVideo",420,300)#窗口大小
cv2.imshow("grayVideo", image_gray)#显示窗口
cv2.imshow("video", image)
key= cv2.waitKey(1)
if key == 32:
break
capture.release()
cv2.destroyAllWindows()
说明:
调整waitKey()方法中的参数值可以控制视频文件的播放速度,例如:当cv2.waitKey(1)时,视频文件的播放速度非常快,当cv2.waitKey(50)时,就能够减缓视频文件的播放速度
加上cv2.CAP_DSHOW 可以解决关闭笔记本内置摄像头时警告信息
2、播放视频文件
1)VideoCapture类及其方法除了能够读取并显示摄像头视频外,还能读取并显示视频文件,当窗口根据视频文件的时长显示视频文件时,便实现了播放视频文件的效果,opencv中的VideoCapture类虽然支持各种格式的视频文件,但是在不同的操作系统中,可能不支持某种格式的视频文件,尽管如此,VideoCapture类能够在不同操作系统中支持后缀名为.avi的视频文件
video = cv2.VideoCapture("d:/openCVImage/video/fastyidong.mp4")
2)视频的暂停播放和继续播放
通过按键指令,在播放视频过程中,实现视频的暂停播放和继续播放
例:在播放视频过程中,当按下空格键时,暂停播放视频,当再次按下空格键时,继续播放视频,当按下esc时,关闭视频文件并销毁显示视频
import cv2
video = cv2.VideoCapture("d:/openCVImage/video/fastyidong.mp4")
frame_Num=1 #用于记录第几辐图像(第几帧),初始值为1 (即第一幅图像)
while video.isOpened():
retval, image = video.read()
cv2.namedWindow("video", 0)
cv2.resizeWindow("video", 1024, 580)
if retval == True:
#当前视频播放到第几帧
#cv2.putText(image,"frame:"+str(frame_Num),(0,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)
#该帧对应着视频的第几秒
#cv2.putText(image, "second:" + str(round(frame_Num / fps,2))+"s", (0, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv2.imshow("video", image)
else:
break
key = cv2.waitKey(10)# 循环等待用户输入,没有输入就继续循环10ms执行等待
if key == 32:
cv2.waitKey(0)#用户按空格键,暂停,无限等
continue
frame_Num+=1
if key == 27:#按esc退出
break
video.release()
cv2.destroyAllWindows()
3)获取视频文件的属性
在实际开发过程中,有时需要获取视频文件的属性,为此,VideoCapture类提供了get()方法,get()方法的语法格式为:
retval = cv2.VideoCapture.get(propId)
retval:获取到与propId对应的属性值
propId:视频文件的属性值,如下:
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
视频是由大量的,连续的图像构成的,把其中的每一幅图像称作一帧,帧数指的是视频文件中含有的图像的总数,帧数越多,视频播放时越流畅,在播放视频过程中,把每秒显示的图像的数量称作帧速率(FPS,单位:帧/s),帧宽度指得是图像在水平方向上含有的像素总数,帧高度指的是图像在垂直方向上含有的像素总数。
举例:显示帧数,帧速率,帧宽度,帧高度,动态显示视频文件属性值等。
import cv2
video = cv2.VideoCapture("d:/openCVImage/video/fastyidong.mp4")
msec=video.get(cv2.CAP_PROP_POS_MSEC)#获取视频文件播放时的当前位置
frames=video.get(cv2.CAP_PROP_POS_FRAMES)#获取帧的索引,从0开始
ratio=video.get(cv2.CAP_PROP_POS_AVI_RATIO)#获取视频文件的相对位置,(0表示开始播放,1表示结束播放)
width=video.get(cv2.CAP_PROP_FRAME_WIDTH)#获取视频文件帧的宽度
height=video.get(cv2.CAP_PROP_FRAME_HEIGHT)#获取视频文件帧的高度
fps=video.get(cv2.CAP_PROP_FPS)#侦速率
fourcc=video.get(cv2.CAP_PROP_FOURCC)#用4个字符表示视频编码格式
count=video.get(cv2.CAP_PROP_FRAME_COUNT)#视频文件的帧数
format=video.get(cv2.CAP_PROP_FORMAT)#retrieve()方法返回的Mat对象的格式
mode=video.get(cv2.CAP_PROP_MODE)#指示当前捕获模式的后端专用的值
rgb=video.get(cv2.CAP_PROP_CONVERT_RGB)#指示是否应该将图像转换为RGB
print("获取视频文件播放时的当前位置msec:",msec)
print("获取帧的索引,从0开始frames:",frames)
print("获取视频文件的相对位置,(0表示开始播放,1表示结束播放)ratio:",ratio)
print("获取视频文件帧的宽度width:",width)
print("获取视频文件帧的高度height:",height)
print("侦速率fps:",fps)
print("用4个字符表示视频编码格式fourcc:",fourcc)
print("视频文件的帧数count:",count)
print("retrieve()方法返回的Mat对象的格式format:",format)
print("指示当前捕获模式的后端专用的值mode:",mode)
print("指示是否应该将图像转换为RGB:",rgb)
frame_Num=1 #用于记录第几辐图像(第几帧),初始值为1 (即第一幅图像)
while video.isOpened():
retval, image = video.read()
cv2.namedWindow("video", 0)
cv2.resizeWindow("video", 1024, 580)
if retval == True:
#当前视频播放到第几帧
cv2.putText(image,"frame:"+str(frame_Num),(0,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)
#该帧对应着视频的第几秒
cv2.putText(image, "second:" + str(round(frame_Num / fps,2))+"s", (0, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv2.imshow("video", image)
else:
break
key = cv2.waitKey(10)# 循环等待用户输入,没有输入就继续循环10ms执行等待
if key == 32:
cv2.waitKey(0)
continue
frame_Num+=1
if key == 27:
break
video.release()
cv2.destroyAllWindows()
3、保存视频文件
在实际开发过程中,很多时候希望保持一段视频,为此,opencv提供了VideoWriter类
1)VideoWriter类中的常用方法包括VideoWriter类的构造方法,write()方法和release()方法,其中VideoWriter类的构造方法用于创建VideoWriter类对象
VideoWriter object :VideoWriter类对象
filename:保存视频时的路径
fourcc:用4个字节表示的视频编码格式
fps:帧速率
frameSize:每一帧的大小
在opencv中,使用cv2.VideoWriter_fourcc()来确定视频编码格式,常用的几个视频编码格式:
cv2.VideoWriter_fourcc('I','4','2','0') 未压缩的YUV颜色编码格式,兼容性好,但文件较大文件拓展名.avi
cv2.VideoWriter_fourcc('P','I','M','I') MPEG-1编码格式文件拓展名.avi
cv2.VideoWriter_fourcc('X','V','I','D') MPEG-4编码格式,视频文件的大小为平均值文件拓展名.avi
cv2.VideoWriter_fourcc('T','H','E','O') Ogg Vorbis 编码格式,兼容性差拓展名.ogv
cv2.VideoWriter_fourcc('F','L','V','I') Flash视频编码格式拓展名.flv
在windows操作系统下,fourcc的值为c.VideoWriter_fourcc('X','V','I','D'),帧速率为20,帧大小为640*480,保存一段视频代码:
fourcc = cv2.VideoWriter_forcc('X', 'V', 'I', 'D')
output = cv2.VideoWriter('output.avi', fourcc, 20, (640, 480))
output.write(frame) #frame 读取到的帧
output.release()
例:保存视频文件前10秒视频
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("save.avi",fourcc, fps, size)# 保存的视频与原视频一样的帧速和帧大小
frame_Num=10*fps
while (video.isOpen() and frame_Num > 0):
retval, frame = video.read()
if retval == TRUE:
output.write(frame)
frame_Num-=1
video.release()
output.release()
cv2.VideoCapture.get () 的 (0-18)参数说明
cv2.VideoCapture.get(0) 视频文件的当前位置(播放)以毫秒为单位
cv2.VideoCapture.get(1) 基于以0开始的被捕获或解码的帧索引
cv2.VideoCapture.get(2) 视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
cv2.VideoCapture.get(3) 在视频流的帧的宽度
cv2.VideoCapture.get(4) 在视频流的帧的高度
cv2.VideoCapture.get(5) 帧速率
cv2.VideoCapture.get(6) 编解码的4字-字符代码
cv2.VideoCapture.get(7) 视频文件中的帧数
cv2.VideoCapture.get(8) 返回对象的格式
cv2.VideoCapture.get(9) 返回后端特定的值,该值指示当前捕获模式
cv2.VideoCapture.get(10) 图像的亮度(仅适用于照相机)
cv2.VideoCapture.get(11) 图像的对比度(仅适用于照相机)
cv2.VideoCapture.get(12) 图像的饱和度(仅适用于照相机)
cv2.VideoCapture.get(13) 色调图像(仅适用于照相机)
cv2.VideoCapture.get(14) 图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
cv2.VideoCapture.get(15) 曝光(仅适用于照相机)
cv2.VideoCapture.get(16) 指示是否应将图像转换为RGB布尔标志
cv2.VideoCapture.get(17) × 暂时不支持
cv2.VideoCapture.get(18) 立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)
更多实例请关注作者csdn其它文章
QQ交流群:856044792