从相机捕获视频
使用笔记本电脑上的摄像头进行捕获实时流
创建一个VideoCapture对象,它的参数可以是设备索引或视频文件的名称。
有时候cap可能尚未初始化捕获,通过 cap.isOpened() 方法检查它是否已初始化。如果是True,那么确定。否则使用cap.open()打开它
cap.read() 返回布尔值(True/ False)。如果正确读取该帧,它将为True。
import numpy as np
import cv2 as cv
def test1():
# 从电脑摄像头读取视频
cap = cv.VideoCapture(0) # 使用笔记本摄像头
if not cap.isOpened(): # 判断摄像头是否打开
print("Cannot open camera")
exit()
while True:
# 逐帧捕获,frame储存帧
ret, frame = cap.read()
# 如果正确读取帧,ret为True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# 我们在框架上的操作到这里
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 显示结果帧e
cv.imshow('frame', gray)
if cv.waitKey(1) == ord('q'):
break
# 完成所有操作后,释放捕获器
cap.release()
cv.destroyAllWindows()
def test2():
# 播放视频文件
cap = cv.VideoCapture('2.avi') # 视频文件最好是avi后缀
while cap.isOpened(): # 捕获成功进行后续操作
ret, frame = cap.read() # 读帧
# if frame is read correctly ret is True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
cv.imshow('frame', gray)
if cv.waitKey(1) == ord('q'):
break
cap.release()
cv.destroyAllWindows()
只需使用 cv.imwrite(),但还需要一些准备工作
创建一个 VideoWriter 对象。我们应该指定输出文件名(例如: output.avi)。然后我们应该指定 FourCC 代码。然后传递帧率的数量和帧大小。最后一个是颜色标志。如果为 True,编码器期望颜色帧,否则它与灰度帧一起工作。
FOURCC是“Four character code”的缩写,也称为4CC。该编码用于指示一个视频的编码压缩格式等信息。一个字符通常占用一个字节也就是8位的存储空间,那么四字码通常占用32位的大小。四个字符通常都是用ASCII字符编码,以方便交流。
AVI是最早被广泛使用的视频格式,其他的4CC编码包括DIVX,XVID,H264,DX50等等。但是这些只是数百个被使用的4CC编码中的很小一部分。
查看视频文件的fourcc编码
fourcc = video.get(cv2.CAP_PROP_FOURCC)
print(fourcc)
# 此时输出的是一个数字,显然不便于我们理解。我们知道opencv提供了cv2.VideoWriter_fourcc()函数来将字符形式的4CC码改为数字型的编码。
def decode_fourcc(cc):
return "".join([chr((int(cc) >> 8 * i) & 0xFF) for i in range(4)]
现在编码用到了CV_FOURCC获取编码格式:
CV_FOURCC(‘P’, ‘I’, ‘M’, ‘1’) = MPEG-1 codec
CV_FOURCC(‘M’, ‘J’, ‘P’, ‘G’) = motion-jpeg codec
CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) = MPEG-4.2 codec
CV_FOURCC(‘D’, ‘I’, ‘V’, ‘3’) = MPEG-4.3 codec
CV_FOURCC(‘D’, ‘I’, ‘V’, ‘X’) = MPEG-4 codec
CV_FOURCC(‘U’, ‘2’, ‘6’, ‘3’) = H263 codec
CV_FOURCC(‘I’, ‘2’, ‘6’, ‘3’) = H263I codec
CV_FOURCC(‘F’, ‘L’, ‘V’, ‘1’) = FLV1 codec