目标:
- 1.读取视频
- 2.显示视频
- 3.保存视频
读取、显示和保存视频
示例:
import cv2
# 1.创建VideoCapture对象-->用于读取视频
# 1)读取摄像头
# cap = cv2.VideoCapture(0)
# 2)视频流地址:http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
cap = cv2.VideoCapture("http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8")
# 3)视频文件路径:D:/迅雷下载/诛仙.mkv
# cap = cv2.VideoCapture("D:/迅雷下载/诛仙.mkv")
if not cap.isOpened(): # 判断cap是否成功捕获
print("Cannot open camera")
exit()
# 2.定义解码器并创造VideoWrite对象-->用于保存视频
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 定义解码器
# 创建视频流写入对象VideoWriter,VideoWriter_fourcc为视频编解码器,30为帧播放速率
# (1920, 1080)为视频帧大小,要与下面frame的大小一致(否则会导致保存的视频无法播放)
out = cv2.VideoWriter('D:/迅雷下载/output.avi', fourcc, 30, (1920, 1080))
while True:
# 3.读取视频
ret, frame = cap.read() # ret表示是否成功获取帧,视频读到结尾,ret就为False。frame是每一帧的图像。
if not ret: # 如果未成功读取帧,就退出循环
print("Can't receive frame (stream end?). Exiting ...")
break
# 4.显示视频图片
cv2.namedWindow("frame", cv2.WINDOW_NORMAL) # 创建一个窗口,可调整大小
cv2.imshow("frame", frame) # 展示视频图片
# 5.保存视频图片
# frame = cv2.flip(frame, 0) # 沿x轴方向翻转图片并保存
out.write(frame) #保存视频图片
print(frame.shape) # (1080, 1920, 3)
# 按'q'键退出循环
if cv2.waitKey(41) & 0xFF == ord('q'):
break
cap.release() # 释放VideoCapture对象
out.release() # 释放VideoWriter对象
cv2.destroyAllWindows() # 销毁所有窗口
函数分析:
-
cv2.VideoCapture() 创建VideoCapture对象-->用于读取视频
它的参数可以是设备索引或视频文件的名称。
参数是0,表示打开笔记本的前置摄像头。
参数是1,表示打开笔记本的后置摄像头。
参数是视频文件路径则采集相应视频。 -
cap.isOpened() 检查cap是否已初始化
-
VideoWriter_fourcc(c1, c2, c3, c4) 定义解码器
FourCC:http://en.wikipedia.org/wiki/FourCC 是用于指定视频编解码器的4字节代码。可用代码列表可在fourcc.org中:http://www.fourcc.org/codecs.php 找到。它取决于平台。遵循编解码器对我来说效果很好。- 在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2。(最好使用XVID。MJPG会生成大尺寸的视频。X264会生成非常小的尺寸的视频)
- 在Windows中:DIVX(尚待测试和添加)
- 在OSX中:MJPG(.mp4),DIVX(.avi),X264(.mkv)。
FourCC代码作为MJPG的
cv.VideoWriter_fourcc('M','J','P','G')
orcv.VideoWriter_fourcc(*'MJPG')
传递。 -
cv2.VideoWriter() 创建一个VideoWriter对象-->用于保存视频
第一个参数表示保存的视频文件名
第二个参数为视频解码器
第三个参数为帧播放速度
第四个参数为视频帧大小 -
ret, frame = cap.read() 按帧读取视频,一帧就是一张图片。
ret是bool类型,表示是否成功获取帧。如果视频读到结尾,那么ret就为False。
frame 是每一帧的图像,是一个三维矩阵numpy.ndarray。 -
cap.release() 释放VideoCapture对象
-
out.release() 释放VideoWriter对象
网友评论