相关函数介绍:
1、视频的读取与显示 了解类VideoCapture:对于视频的读取,OpenCv提供了接口VideoCapture。要想实现视频的读取与显示,需要熟悉一下该类的构造函数和成员函数。VideoCapture的两个常见构造函数如下:
- = cv2.VideoCapture(filename)
功能:打开视频文件
参数filename:视频的文件名 - = cv2.VideoCapture(index)
功能:打开相机设备
参数index:相机设备ID,当只有一个相机时,给0即可
VideoCapture常用到的成员函数:
- retval =cv2.VideoCapture. isOpened() #判断视频捕获是否初始化成功。初始化成功返回true。
- retval = cv2.VideoCapture.get(propId) #得到相机/视频文件的各种属性。
- retval = cv2.VideoCapture.set(propId,value) #设置属性,第一个参数是选择属性类型,第二个参数是值。
- retval,image= cv2.VideoCapture.read([,image]) #抓取,解码并返回下一个视频帧。返回值为true表明抓取成功。
- none = cv2.VideoCapture.release() #关闭视频文件或相机设备。
从相机中读取并显示视频代码:
VideoDemo:
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)#构造函数,调用设备,0指只有一个设备
if not cap.isOpened():
print("Cannot open camera")
exit() #判断初始化是否成功,成功以后进入循环
while True:
ret, frame = cap.read() #ret捕获视频frame视频帧数据
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break #不能捕获,可能被占用或者出现摄像头问题
#可以创新在此处添加美颜代码
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break #q键关闭窗口
cap.release()
cv.destroyAllWindows()#释放销毁窗口
从视频文件中读取视频的相关完整代码:
import numpy as np
import cv2
cap = cv2.VideoCapture('Minions_banana.mp4')#视频文件的名字
# 帧率
fps = cap.get(cv2.CAP_PROP_FPS) # 25.0
print("frames per second using video.get(cv2.CAP_PROP_FPS) : {0}".format(fps))
# 总共有多少帧
num_frames = cap.get(cv2.CAP_PROP_frame_COUNT)
print('共有', num_frames, '帧')
#视频文件的尺寸
frame_height = cap.get(cv2.CAP_PROP_frame_HEIGHT)
frame_width = cap.get(cv2.CAP_PROP_frame_WIDTH)
print('高:', frame_height, '宽:', frame_width)
#当前帧数
frame_NOW = cap.get(cv2.CAP_PROP_POS_frameS) # 第0帧
print('当前帧数', frame_NOW) # 当前帧数 0.0
# 读取指定帧,对视频文件才有效,对摄像头无效
frame_no = 121
cap.set(1, frame_no) # Where frame_no is the frame you want
ret, frame = cap.read() # Read the frame
cv2.imshow('frame_no'+str(frame_no), frame)
frame_NOW = cap.get(cv2.CAP_PROP_POS_frameS)
print('当前帧数', frame_NOW) # 当前帧数 122.0
while cap.isOpened():
ret, frame = cap.read()#捕获一帧图像
frame_NOW = cap.get(cv2.CAP_PROP_POS_frameS) # 当前帧数
print('当前帧数', frame_NOW)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', gray)
key = cv2.waitKey(1)
if key == ord("q"):
break
cap.release() #关闭相机
cv2.destroyAllWindows() #关闭窗口
2、视频的保存
对于视频的保存,OpenCv提供了接口VideoWriter。要想实现保存视频,需要熟悉一下该类的构造函数和成员函数。
- = cv.VideoWriter( filename, fourcc, fps, frameSize[, isColor] )
参数:
filename:给要保存的视频起个名字
fourcc:指定视频编解码器的4字节代码
fps:帧率
frameSize:帧大小
isColor:如果为true,则视频为彩色,否则为灰度视频,默认为true - retval = cv2.VideoWriter_fourcc( c1, c2, c3, c4 )
它是用于压缩帧的4字符编解码器代码。如VideoWriter :: fourcc(‘P’,‘I’,‘M’,‘1’)是MPEG-1编解码器,VideoWriter :: fourcc(‘M’,‘J’,‘P’,'G ')是一个运动jpeg编解码器等。 - None = cv.VideoWriter.write( image )
功能:将帧图像保存为视频文件。
相关完整代码:
import numpy as np
import cv2
from videowrite import fourcc# 从videowrite中调用fourcc
cap = cv2.VideoCapture(0) #捕获摄像头
width = 640 #设置摄像头窗口的尺寸
ret = cap.set(3, width)
height = 480
ret = cap.set(4, height)
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (width, height))
# 视频名字, 指定的视频编码解码的4节代码, 帧率, 帧大小(宽,高)
while cap.isOpened(): # 检查是否成功初始化,否则就 使用函数 cap.open()
ret, frame = cap.read() # 抓取图像,ret 返回一个布尔值 True/False
if ret is True: #true为彩色,否则为灰色
frame = cv2.resize(frame, (640, 480))
out.write(frame) #保存视频
cv2.imshow('frame', frame) #显示视频
else: #否则就break
break
key = cv2.waitKey(1)
if key == ord("q"): #输入q关闭窗口
break
cap.release() #释放摄像头窗口
out.release() #释放保存的视频
cv2.destroyAllWindows() # 摧毁窗口
以上是opencv对视频的读取显示和保存,其实和图片有很大的相似性,图片用到的imread imshow imwrite,视频用到了videocapture videowriter,都需要初始化,都可以调节尺寸和灰度值,不同的地方在于视频用ret函数去捕获,图片直接可以用imread加载。



