视频入门
目标
- 学习阅读视频,显示视频和保存视频。
- 学习从相机捕捉并显示它。
- 您将学习以下功能:cv2.VideoCapture(),cv2.VideoWriter()
从相机捕获视频
通常,我们必须用相机捕捉直播流。OpenCV提供了一个非常简单的界面。让我们从相机中捕捉视频(我正在使用笔记本电脑的内置摄像头),将其转换为灰度视频并显示出来。只是一个简单的任务开始。
要捕捉视频,您需要创建一个VideoCapture对象。它的参数可以是设备索引或视频文件的名称。设备索引只是指定哪台摄像机的号码。通常会连接一台摄像机(就像我的情况一样)。所以我只是通过0(或-1)。您可以通过传递1等来选择第二台相机。之后,您可以逐帧捕捉。但最后,不要忘记释放捕获。
import numpy as np import cv2 cap = cv2 。VideoCapture (0 ) while (True ): #捕获逐帧 ret , frame = cap 。read () #我们在框架上的操作来到这里 灰色 = cv2 。cvtColor (帧, CV2 。COLOR_BGR2GRAY ) #显示结果帧 cv2 。imshow ('frame' ,灰色) 如果 cv2 。waitKey (1 ) & 0xFF == ord ('q' ): break #完成所有事情后,释放捕获 上限。释放() cv2 。destroyAllWindows ()
cap.read()
返回一个bool(True / False)。如果帧被正确读取,它将是真实的。所以你可以通过检查这个返回值来检查视频的结束。
有时候,cap
可能没有初始化捕获。在这种情况下,这段代码显示错误。您可以通过cap.isOpened()方法检查它是否被初始化。如果它是真的,好的。否则使用cap.open()打开它。
您还可以使用cap.get(propId)方法访问此视频的某些功能,其中propId是一个从0到18的数字。每个数字表示视频的属性(如果它适用于该视频),并且完整的详细信息可以在这里可以看到:Property Identifier。其中一些值可以使用cap.set(propId,value)进行修改。价值是你想要的新价值。
例如,我可以通过cap.get(3)
和检查框架的宽度和高度cap.get(4)
。它默认给我640x480。但我想修改为320x240。只需使用和。ret = cap.set(3,320)
ret = cap.set(4,240)
注意
如果出现错误,请确保相机使用任何其他相机应用程序正常工作(如Linux中的Cheese)。
从文件播放视频
它与从相机拍摄相同,只需更改相机索引与视频文件名。同时显示框架时,请使用适当的时间cv2.waitKey()
。如果它太少,视频会非常快,如果它太高,视频会很慢(嗯,这是如何以慢动作显示视频)。正常情况下,25毫秒即可。
import numpy as np import cv2 cap = cv2 。VideoCapture ('vtest.avi' ) while (cap . isOpened ()): ret , frame = cap 。read () 灰色 = cv2 。cvtColor (帧, CV2 。COLOR_BGR2GRAY ) cv2 。imshow ('frame' ,灰色) 如果 cv2 。waitKey (1 ) & 0xFF == ord ('q' ): break 帽子。释放() cv2 。destroyAllWindows ()
注意
确保安装了适当版本的ffmpeg或gstreamer。有时,使用视频捕捉工作很头疼,主要是由于ffmpeg / gstreamer安装错误。
保存视频
因此,我们捕捉视频,逐帧处理它,并且我们想要保存该视频。对于图像来说,它非常简单,只需使用即可cv2.imwrite()
。这里需要更多的工作。
这次我们创建一个VideoWriter对象。我们应该指定输出文件名(例如:output.avi)。然后我们应该指定FourCC代码(下一段详细介绍)。然后应该传递每秒帧数(fps)和帧大小。最后一个是isColor标志。如果它是真的,编码器会期望彩色框架,否则它将与灰度框架一起工作。
FourCC是用于指定视频编解码器的4字节代码。可用代码列表可以在fourcc.org中找到。它依赖于平台。以下编解码器对我来说工作正常。
- 在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2。(XVID是更可取的,MJP*生高分辨率视频,X264分辨率非常小)
- 在Windows中:DIVX(更多要测试和添加)
- 在OSX中:( 我没有访问OSX的权限,有人可以填写吗?)
FourCC代码作为MJPG cv2.VideoWriter_fourcc('M','J','P','G')
或cv2.VideoWriter_fourcc(*'MJPG)
MJPG 传递。
下面的代码从摄像头捕获,在垂直方向翻转每一帧并保存。
import numpy as np import cv2 cap = cv2 。VideoCapture (0 ) #定义编解码器并创建VideoWriter对象 fourcc = cv2 。VideoWriter_fourcc (* 'XVID' ) out = cv2 。VideoWriter ('output.avi' ,fourcc值, 20.0 , (640 ,480 )) while (cap . isOpened ()): ret , frame = cap 。read () 如果 ret == True : frame = cv2 。翻转(框架,0 ) #写翻转帧 出来。写(帧) cv2 。imshow ('frame' ,frame ) 如果 cv2 。waitKey (1 ) & 0xFF == ord ('q' ): break else : break #如果作业完成后放开一切 帽。发行() 了。释放() cv2 。destroyAllWindows ()