参考OpenCV-Python官方文档:https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html
学会去读取视频、展示视频以及保存视频
从摄像头捕捉视频图像并展示
学习cv2.VideoCapture(),cv2.VideoWriter()的用法
通常,我们需要通过摄像头实时捕捉视频流数据,OpenCV提供了非常简单的接口。首先需要创建一个VideoCapture对象,它的参数是视频文件的名字或者设备索引。设备索引就是用来指定摄像头的数字。然后你可以逐帧地获取到数据,最后要记得释放Capture。
import numpy as np
import cv2
cap = cv2.VideoCapture(0) ## 因为我用的笔记本自带的摄像头 只有一个
while(True):
# 逐帧地获取数据
ret, frame = cap.read()
# 在frame上进行操作
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 展示结果
cv2.imshow('frame', gray)
if cv2.waitKey(1) & 0xFF == ord('q'): # 按下q就退出
break
# 释放capture
cap.release()
cv2.destroyAllWindows()
说明:
当代码报错的时候,可以用cap.isOpened()来判断是否初始化成功,如果成功就会返回True,如果返回False,使用cap.Open()来初始化。
可以通过cap.get(propld)来获取到一些视频的属性,propld是0-18之间的数字,每个数字表示一个属性,这里贴上一张对应图,有需要的可以看一下。
例如,可以通过 cap.get(3)和cap.get(4)来得到每一帧的宽、高,然后可以通过ret = cap.set(3, 300),ret = cap.set(4, 300)修改其宽高为300x300。
和上面的获取实时视频数据一样,主要区别就是将设备索引(device index)改为视频文件名。使用cv2.waitKey()来设置合适的展示时间,如果数值太小将会播放得非常快,如果太大将会播放地非常慢,正常情况下设置25就可以了。
cap = cv2.VideoCapture('testvideo.mp4')
while(True):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', gray)
if cv2.waitKey(1) & 0xFF == ord('q'): # 我设置为1 相当于开了快进
break
cap.release()
cv2.destroyAllWindows()
我们捕获到了视频,并且做了相应的处理,现在就需要把它保存下来,跟图像的保存不一样,无法简单地使用cv2.imwrite()。
首先我们应该创建一个VideoWrite对象,指明文件名以及FourCC编码,每秒应该传递的帧率(fps),以及保存的帧尺寸,还可以设置一个isColor的标签(如果为True,使用彩色编码器,否则使用灰度)[仅在Windows系统上支持]。
FourCC是指定一个四字节的视频编码器,一般遵循:
FourCC通过 cv2.VideoWriter_fourcc(‘M’,‘J’,‘P’,‘G’) 或者cv2.VideoWriter_fourcc(* 'MJPG) 来定义。 (以MJPG为例)
cap = cv2.VideoCapture(0)
w = int(cap.get(3))
h = int(cap.get(4))
fps = cap.get(5)
## 定义编码器以及VideoWrite
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter('output.avi', fourcc, fps,(w, h))
while(cap.isOpened()):
ret, frame = cap.read()
# 做一个水平垂直翻转
frame = cv2.flip(frame, -1)
cv2.imshow('frame', frame)
out.write(frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()