OpenCV 录取/播放/保存视频操作
OpenCV视频操作学习目标
- 学习阅读视频,显示视频和保存视频。
- 学习从摄像头捕捉并显示它。
- 您将学习这些功能:
cv2.VideoCapture()
,cv2.VideoWriter()
1、用摄像头捕获视频
通常,我们必须用摄像头捕捉实时流。OpenCV
提供了一个非常简单的接口。让我们从摄像头中捕捉视频(我正在使用笔记本电脑的内置摄像头),将其转换为灰度视频并显示。只是一个简单的任务开始。
要捕捉视频,您需要创建一个VideoCapture
对象。它的参数可以是设备索引或视频文件的名称。设备索引只是指定哪个摄像头的号码。通常一个相机将被连接(就像我的情况)。所以我只是通过0(或-1)。您可以通过传递1等来选择第二台相机。之后,您可以逐帧捕捉。但最后,不要忘记释放捕获。
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Display the resulting frame
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
cap.read()
返回一个布尔True/False
。如果帧被正确读取,则为True
。所以你可以通过检查这个返回值来检查视频的结束。
有时候,cap
可能没有初始化捕获。在这种情况下,这段代码显示错误。你可以通过cap.isOpened()
方法检查它是否被初始化。如果它是True
,好的。否则使用cap.open()
打开它。
您还可以使用cap.get(propId)
方法访问此视频的某些功能,其中propId
是一个从0到18的数字。每个数字表示视频的一个属性(如果该视频适用于该视频),详细信息可以在这里可以看到:属性标识符。其中一些值可以使用cap.set(propId,value)
进行修改。 值是你想要的新值。
例如,其中一些值可以使用cap.set(propId,value)
来修改,例如cap.get(3)
和cap.get(4)
来查看每一帧的宽和高,默认是640x480
。我们可以使用ret=cap.set(3,320)
和ret = cap.set(4,240)
来把宽和高改成320x240
。
2、从文件中播放视频
把设备索引号改成文件名即可。在播放每一帧时,使用cv2.waitKey()
适当持续时间,如果它太少,视频会非常快,如果它太高,视频会很慢(那么,这是如何以慢动作显示视频)。正常情况下,25ms
即可。
import numpy as np
import cv2
cap = cv2.VideoCapture('vtest.avi')
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()
3、保存视频
所以我们拍摄一个视频,逐帧处理,我们要保存视频。对于图像来说,这非常简单,只是使用cv2.imwrite()
。 但是视频需要更多的工作。
创建一个VideoWrite
的对象,确定输出文件名,指定FourCC
编码,播放频率和帧的大小,最后是isColor
标签True
为彩色。 FourCC
是一个4字节码,用来确定视频的编码格式。
- 1、In Fedora : DIVX , XVID , MJPG , X264 , WMV1 , WMV2 XVID是最好的,MJPG是高尺寸视频,X264得到小尺寸视频
- 2、In Windows : DIVX
- 3、In OSX :不知道用什么好
设置FourCC格式时,原文里采用了·cv2.VideoWriter_fourcc()·这个函数,若运行程序的时候显示这个函数不存在,可以改用了·cv2.cv.CV_FOURCC·这个函数。
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
frame = cv2.flip(frame,0)
# write the flipped frame
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()