0. 目标
- 读取、显示和保存视频文件
- 从摄像头获取并显示视频
1. 摄像头捕获视频
- cv2.VideoCapture(mode):mode可以是视频文件,也可以是摄像头设备
- 数字:代表设备索引号,通常单个摄像头,则0就是该摄像头
- 视频文件路径:视频文件
cap=VideoCapture(0) #使用我的笔记本内置摄像头,创建了cap这样一个对象
-
cap.isOpend():摄像头是否正确打开,返回值为布尔值类型
-
cap.open():打开摄像头
-
cap.read():返回两个量,第一个表示帧读取是否正确(True/False),第二个表示读取到的帧图像
import cv2
cap=cv2.VideoCapture(0) #使用我的内置摄像头创建视频对象cap
if not cap.isOpened(): # 如果摄像头没打开,则打开摄像头
cap.open()
ret,frame=cap.read() #获取帧图像
if ret: # 如果帧图像获取正确,则打印帧图像
cv2.imshow("image",frame)
cv2.waitKey(0)
cv2.destroyWindow("image")
- cap.get(propId):获取视频的一些参数信息,propId代表你像了解哪些信息:
propId | 内容 |
---|---|
0 | 视频文件的当前位置(播放)以毫秒为单位 |
1 | 基于以0开始的被捕获或解码的帧索引 |
2 | 视频文件的相对位置(播放):0=电影开始,1=影片的结尾。 |
3 | 在视频流的帧的宽度 |
4 | 在视频流的帧的高度 |
5 | 帧速率 |
6 | 编解码的4字-字符代码 |
7 | 视频文件中的帧数 |
8 | 返回对象的格式 |
9 | 返回后端特定的值,该值指示当前捕获模式 |
10 | 图像的亮度(仅适用于照相机) |
11 | 图像的对比度(仅适用于照相机) |
12 | 图像的饱和度(仅适用于照相机) |
13 | 色调图像(仅适用于照相机) |
14 | 图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升) |
15 | 曝光(仅适用于照相机) |
16 | 指示是否应将图像转换为RGB布尔标志 |
17 | × 暂时不支持 |
18 | 立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能) |
- cap.set(propId,value):如果你想修改上方的这些值,可以通过传入propId和value来进行修改
- cap=VideoCapture():上方已经讲过,这里讲述传入视频文件;当我们传入视频文件时,其实可以通过waitKey来控制视频的播放速度
cap=cv2.VideoCapture("lx.mp4") # 读取视频
while True:
ret,frame=cap.read()
if ret:
cv2.imshow("",frame)
cv2.waitKey(250) #等待250ms后,执行下一步(从而放慢了视频的播放速度)
2. 写入视频文件
-
videowrite=cv2.VideoWrite(file,fourcc,fps,shape,isColor):创建一个视频写入对象:
-
file:定义一个文件名
-
fourcc:指定编码模式(但是以数值形式传入,故要用下方这个函数)
-
fps:帧率
-
shape:帧图像的大小,用一个元组指定(整形)
-
isColor:是否以彩色保存,布尔值
-
cv2.VideoWriter_fourcc(c1,c2,c3,c4):将编码模式转为数值型
参数 | 编码类型 | 文件后缀名 |
---|---|---|
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 |
# 创建一个视频写入对象:结束时保存为cam.avi,编码模式I420,帧率为25,视频帧尺寸为256*256
videowrite = cv2.VideoWriter("cam.avi", cv2.VideoWriter_fourcc('I', '4', '2', '0'), 25, (256,256))
- videowrite.write(frame):将frame图像写入视频写入对象中(要释放后才正式保存)
# 将摄像头视频保存为cam.avi
import cv2
cap = cv2.VideoCapture(0) # 使用内置摄像头并创建视频对象
weight=int(cap.get(3)) # 获取摄像头宽和高
high=int(cap.get(4))
# 创建视频写入对象
videowrite = cv2.VideoWriter("cam.avi", cv2.VideoWriter_fourcc('I', '4', '2', '0'), 100, (weight,high))
if not cap.isOpened():
cap.open()
while True:
ret, frame = cap.read()
if ret:
videowrite.write(frame) #将当前帧写入videowrite对象中
cv2.imshow("", frame)
k = cv2.waitKey(25) # 等待25ms
if k == 27: # 如果按ESC则推迟
break
videowrite.release() #释放视频写入对象,才正式保存cam.avi
cap.release() # 释放视频对象
cv2.destroyAllWindows()
可能的bug
- 保存后视频文件打开没视频,文件大小很小:建议检查创建视频写入对象时帧图像的大小是否和摄像头大小一样
- pycharm中出现警告:~SourceReaderCB terminating async callback,放一篇建议博客