直接上源码:
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 30.0, (640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
frame = cv2.flip(frame,1)
# out.write(cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)) 将视频转换为灰色的源
out.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('1'):
break
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
使用摄像头,需要使用cv2.VideoCapture(0)
创建VideoCapture对象;
参数0表示打开笔记本的内置摄像头,如果你电脑上有两个摄像头的话,访问第2个摄像头就可以传入1。参数是视频文件路径则打开视频,如cap = cv2.VideoCapture("…/test.avi")。
cap.read()
按帧读取视频,ret,frame是获cap.read()方法的两个返回值。其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。
此外,通过cap.get(propId)
可以获取摄像头的一些属性,比如捕获的分辨率,亮度和对比度等。
propId是从0~18的数字,代表不同的属性。也可以使用cap.set(propId,value)
来修改属性值。比如说,我们在while之前添加下面的代码:
# 获取捕获的分辨率
# propId可以直接写数字,也可以用OpenCV的符号表示
width, height = capture.get(3), capture.get(4)
print(width, height)
# 以原分辨率的一倍来捕获
capture.set(cv2.CAP_PROP_FRAME_WIDTH, width * 2)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, height * 2)
waitKey()
方法本身表示等待键盘输入,
参数是1,表示延时1ms切换到下一帧图像,对于视频而言;
参数为0,如cv2.waitKey(0)只显示当前帧图像,相当于视频暂停,;
参数过大如cv2.waitKey(1000),会因为延时过久而卡顿感觉到卡顿。
调用release()
释放摄像头,调用destroyAllWindows()关闭所有图像窗口。
保存视频,我们需要创建一个VideoWriter
的对象,需要给它传入四个参数:
输出的文件名,如’output.avi’
编码方式FourCC码
帧率FPS
要保存的分辨率大小
FourCC是用来指定视频编码方式的四字节码,如XVID编码可以这样写:cv2.VideoWriter_fourcc(*'XVID')
或cv2.VideoWriter_fourcc('X','V','I','D')
使用函数cv2.imshow()
显示图像。窗口会自动调整为图像大小。第一个参数是窗口的名字,其次才是我们的图像。你可以创建多个窗口,只要你喜欢,但是必须给他们不同的名字。
destroyAllWindows()
关闭所有的HighGUI窗口。