计算机视觉 OpenCV (2)
2019-08-03 本文已影响13人
zidea
图
今天分享的是如何通过 OpenCV 读写视频流。
读取视频流
import cv2
cap = cv2.VideoCapture(0)
这里 VideoCapture 方法参数 0 表示读取默认摄像头的视频流,如果使用 0 没有成功可尝试给 -1,当设备有两个摄像头可以通过 1 来得到第二个摄像头的视频流。
while(True):
ret, frame = cap.read()
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap 的 read 读取视频流方法会返回来两个参数, ret 表示是否成功获取视频流,而 frame 这是每一帧的画面,我们通过 imshow 方法将捕获画面显示出来,最后通过判断用户是否按下 q 键来执行退出操作。
cap.release()
cv2.destroyAllWindows()
退出后我们还有一些重要的收尾工作就是需要释放掉 cap 对象。
读取视频流完整代码
import cv2
# -1 1
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
我们也可以在输出每一帧画面前,对画面进行处理,这里通过 cvtColor 读取 frame 视频流根据指定第二个参数 cv2.COLOR_BGR2GRAY 将视频流数据转换为灰度图片
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
将图片处理为灰度图,使用了 cvtColor 方法来实现。然后通过 cap 的 isOpened 方法来判断是否成功捕获到图片。
while(cap.isOpened()):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
通过 cap 实例也可以获取一些读取视频流的设置,下面可以输出读取视频流的视频的尺寸,也就是掌管
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
1280.0
720.0
保存图像
VideoWriter_fourcc 用来设置需要保存视频的格,查看可以一个一个字符输入,可以可以以 * 开始输入这个字符串。
fourcc = cv2.VideoWriter_fourcc('X','V','I','D')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
使用 VideoWriter 读取视频流,第一个参数为要写入的文件,第二个参数为输出的视频的格式,
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc,20.0,(1280,720))
while(cap.isOpened()):
ret, frame = cap.read()
if ret == True:
# print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
# print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
out.write(frame)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()