OpenCV(26-1):视频分析之一:视频的捕捉、保存、和释放
26.1视频的捕捉、保存、和释放
opencv不仅能够处理图像,还能够处理视频,视频是由大量的图像构成的,这些图像是以固定的时间间隔从视频中获取的,这样就能够使得图像处理的方法对这些图像进行处理,进而达到处理视频的目的,要想处理视频,需要对视频就行读取,显示,保存等相关操作,为此,opencv提供了VideoCapture类和VideoWriter类的相关方法。
26.1.1 视频的捕捉
cv2.VideoCapture()捕捉视频源
视频由大量的图像构成,把这些图像称为帧。VideoCapture类提供了构造方法VideoCapture(),用于完成视频读取和摄像头的初始化工作。
原型:capture = cv2. VideoCapture(video)
参数:
- video 要捕捉的视频源(摄像头或视频文件)。video=num,来控制不同的设备,如0表示打开笔记本的内置摄像头,1表示打开其他摄像设备等。video=str,则打开以str命名的视频文件
返回值:capture。
capture.isOpened() 判断读取视频文件或打开摄像头是否成功
原型:retval=capture.isOpened()
返回值:retval。读取视频文件或打开摄像头成功,retval值为True,否则,retval的值为False
cap.read()视频的按帧捕捉
作用:按帧读取视频,cap是通过cv2.VideoCapture()捕捉到的视频源对象
原型:ret,frame =cap.read()
参数:无
返回值:ret,frame是获cap.read()方法的两个返回值。
- ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。
- frame就是每一帧的图像,是个三维矩阵。如果没有帧被捕获到,则该值为空。
capture.release()释放视频源
作用:释放已经捕捉的视频源,capture是通过cv2.VideoCapture()捕捉到的视频源对象
原型:capture.release()
参数:无
返回值:无
capture.get(propID) 获取视频文件的属性
视频是由大量的,连续的图像构成的,把其中的每一幅图像称作一帧,帧数指的是视频文件中含有的图像的总数,帧数越多,视频播放时越流畅,在播放视频过程中,把每秒显示的图像的数量称作帧速率(FPS,单位:帧/s),帧宽度指得是图像在水平方向上含有的像素总数,帧高度指的是图像在垂直方向上含有的像素总数。
原型:retval = capture.get(propId)
参数:propId :视频文件的属性值,(从0开始编号,比如这里为了获取视频的总帧数,在下表是排第六个的CV_CAP_PROP_FPS)如下:
- 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_BRIGHTNESS 图像亮度(仅适用于相机)。
- cv2.CAP_PROP_CONTRAST图像对比度(仅适用于相机)。
- cv2.CAP_PROP_SATURATION图像的饱和度(仅适用于相机)。
- cv2.CAP_PROP_HUE图片的色调(仅相机使用)。
- cv2.CAP_PROP_GAIN图像增益(仅相机)。
- cv2.CAP_PROP_EXPOSURE曝光(仅用于相机)。
- cv2.CAP_PROP_CONVERT_RGB Boolean标志,指示是否应将图像转为RGB
- cv2.CAP_PROP_WHITE_BALANCE_U白平衡设置的U值(注:仅DC1394 v2支持)。x目前后台)
- cv2.CAP_PROP_WHITE_BALANCE_V白平衡设置的V值(注:仅DC1394 v2支持)。x目前后台)
- cv2.CAP_PROP_RECTIFICATION立体相机矫正标志(注:仅DC1394 v2支持。x目前后台)
- cv2.CAP_PROP_ISO_SPEED相机的ISO速度(注:仅DC1394 v2支持。x目前后台)
- cv2.CAP_PROP_BUFFERSIZE存储在内部缓冲内存中的帧的数量(注:仅支持DC1394 v2。x目前后台)
返回值:获取到与propId对应的属性值
示例
该示例打开笔记本内置摄像头,不停捕捉帧,按空格键暂停,按“Esc”键退出
import cv2
import numpy as np
# 滑动条的回调函数,我们这里没有,所以就设置为空了
def empty(a):
pass
cap=cv2.VideoCapture(0)
# 设置窗口的名称
cv2.namedWindow("TrackBars")
# 固定窗口的大小
cv2.resizeWindow("TrackBars", 640, 240)
# 创建滑动控制条:分别设置其滑动条的名称,所在的窗口的名称,最小值,最大值,回调函数
cv2.createTrackbar("hue min", "TrackBars", 0, 179, empty)
cv2.createTrackbar("hue max", "TrackBars", 26, 179, empty)
cv2.createTrackbar("sat min", "TrackBars", 52, 255, empty)
cv2.createTrackbar("sat max", "TrackBars", 255, 255, empty)
cv2.createTrackbar("val min", "TrackBars", 138, 255, empty)
cv2.createTrackbar("val max", "TrackBars", 255, 255, empty)
# 我们这里用 while True 死循环来充当回调函数,相当于回调函数的效果
while True:
# 读取图片
ret,img=cap.read()
imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 获得滑动条当前的值,这个值的改变是由于你的拖拽改变的
h_min = cv2.getTrackbarPos("hue min", "TrackBars")
h_max = cv2.getTrackbarPos("hue max", "TrackBars")
s_min = cv2.getTrackbarPos("sat min", "TrackBars")
s_max = cv2.getTrackbarPos("sat max", "TrackBars")
v_min = cv2.getTrackbarPos("val min", "TrackBars")
v_max = cv2.getTrackbarPos("val max", "TrackBars")
print(h_min, h_max, s_min, s_max, v_min, v_max)
lower = np.array([h_min, s_min, v_min])
upper = np.array([h_max, s_max, v_max])
mask = cv2.inRange(imgHSV, lower, upper)
imgresult = cv2.bitwise_and(img,img,mask=mask)
cv2.imshow("original", img)
cv2.imshow("imgHSV", imgHSV)
cv2.imshow("mask", mask)
cv2.imshow("imgresult", imgresult)
cv2.waitKey(1)import cv2
video = cv2.VideoCapture(0) # 打开摄像头
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: # Esc键退出播放
break
video.release() # 释放视频源
cv2.destroyAllWindows()

26.1.2 cv2.VideoWrite()保存视频
在实际开发过程中,很多时候希望保持一段视频,为此,opencv提供了VideoWriter类。VideoWriter类中的常用方法包括VideoWriter类的构造方法,write()方法和release()方法,其中VideoWriter类的构造方法用于创建VideoWriter类对象。
原型:vw=cv2.VideoWriter(filename, fourcc, fps, frameSize[, isColor])
参数:
- filename:要保存的文件的路径
- fourcc: 指定编码器。fourcc意为四字符代码(Four-Character Codes),顾名思义,该编码由四个字符组成, 在opencv中,使用cv2.VideoWriter_fourcc()来确定视频编码格式,常用的几个视频编码格式,注意:字符顺序不能弄混。 cv2.VideoWriter_fourcc('M', 'P', '4', 'V') MPEG-4编码 .mp4 要限制结果视频的大小,这是一个很好的选择。 cv2.VideoWriter_fourcc('X','2','6','4') MPEG-4编码 .mp4 想限制结果视频的大小,这可能是最好的选择。 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', '1'),该参数是Flash视频,文件名后缀为.flv。 cv2.VideoWriter_fourcc('U', '2', '6', '3') = H2634 codec .mp4 ,可以在H5上播放。cv2.VideoWriter_fourcc('I', '2', '6', '3') = H264I codec .mp4,可以在H5上播放
- fps: 要保存的视频的帧率
- frameSize: 要保存的文件的画面尺寸
- isColor: 指示是黑白画面还是彩色的画面
返回值:vw,VideoWriter类对象
示例
## 保存视频文件前10秒视频
import cv2
video = cv2.VideoCapture(0)
fps = video.get(cv2.CAP_PROP_FPS)#获取原视频文件的帧速
width = video.get(cv2.CAP_PROP_FRAME_WIDTH)
height = video.get(cv2.CAP_PROP_FRAME_HEIGHT)
size = (int(width),int(height))
fourcc = cv2.VideoWriter_fourcc('X','V','I','D')
output = cv2.VideoWriter("save.avi",fourcc, fps, size)# 保存的视频与原视频一样的帧速和帧大小
frame_Num=10*fps
while (video.isOpened() and frame_Num > 0):
retval, frame = video.read()
if retval == True:
output.write(frame)
frame_Num-=1
video.release()
output.release()
26.1.3 使用滑动条
cv2.createTrackbar()
功能:绑定滑动条和窗口,定义滚动条的数值
原型:cv2.createTrackbar(barName, winName, minVal, maxVal, callback)
- barName:滑动条的名字,
- winName:滑动条被放置的窗口的名字,
- minVal:滑动条最小值
- maxVal:滑动条的最大值,
- callback:回调函数名,每次滑动都会调用回调函数。
cv2.getTrackbarPos()
功能:得到滑动条的数值
原型:cv2.getTrackbarPos(barName, winName)
参数:
- barName:滑动条的名字,
- winName:滑动条被放置的窗口的名字,
返回值:是滑动条的数值
cv2.setTrackbarPos()
功能:设置滑动条的默认值
原型:cv2.setTrackbarPos(barName, winName,value)
参数:
- barName:滑动条的名字,
- winName:滑动条被放置的窗口的名字,
- value:滑动条设置的默认值
示例
import cv2
import numpy as np
# 滑动条的回调函数,我们这里没有,所以就设置为空了
def empty(a):
pass
cap=cv2.VideoCapture(0)
# 设置窗口的名称
cv2.namedWindow("TrackBars")
# 固定窗口的大小
cv2.resizeWindow("TrackBars", 640, 240)
# 创建滑动控制条:分别设置其滑动条的名称,所在的窗口的名称,最小值,最大值,回调函数
cv2.createTrackbar("hue min", "TrackBars", 0, 179, empty)
cv2.createTrackbar("hue max", "TrackBars", 26, 179, empty)
cv2.createTrackbar("sat min", "TrackBars", 52, 255, empty)
cv2.createTrackbar("sat max", "TrackBars", 255, 255, empty)
cv2.createTrackbar("val min", "TrackBars", 138, 255, empty)
cv2.createTrackbar("val max", "TrackBars", 255, 255, empty)
# 我们这里用 while True 死循环来充当回调函数,相当于回调函数的效果
while True:
# 读取图片
ret,img=cap.read()
imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 获得滑动条当前的值,这个值的改变是由于你的拖拽改变的
h_min = cv2.getTrackbarPos("hue min", "TrackBars")
h_max = cv2.getTrackbarPos("hue max", "TrackBars")
s_min = cv2.getTrackbarPos("sat min", "TrackBars")
s_max = cv2.getTrackbarPos("sat max", "TrackBars")
v_min = cv2.getTrackbarPos("val min", "TrackBars")
v_max = cv2.getTrackbarPos("val max", "TrackBars")
print(h_min, h_max, s_min, s_max, v_min, v_max)
lower = np.array([h_min, s_min, v_min])
upper = np.array([h_max, s_max, v_max])
mask = cv2.inRange(imgHSV, lower, upper)
imgresult = cv2.bitwise_and(img,img,mask=mask)
cv2.imshow("original", img)
cv2.imshow("imgHSV", imgHSV)
cv2.imshow("mask", mask)
cv2.imshow("imgresult", imgresult)
cv2.waitKey(1)
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)