Opencv+Python(2):Getting Started with Videos

时间:2020-12-05 06:01:45

视频入门

目标

  • 学习阅读视频,显示视频和保存视频。
  • 学习从相机捕捉并显示它。
  • 您将学习以下功能: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 ()