OpenCV提供了cv2.VideoCapture类来处理视频。既能处理视频文件又能处理摄像头信息。

VideoCapture类函数介绍

cv2.VideoCapture类的常用函数包括初始化、打开、帧捕获、释放、属性设置等。

1、初始化

捕获对象 = cv2.VideoCapture(摄像头ID号)
  • 摄像头ID号:参数为摄像头的ID编号,而不是文件名。其默认值为-1,表示随机选取一个摄像头;如果有多个摄像头,则数字0表示第一个摄像头,数字1表示第二个摄像头,以此类推。如果只有一个摄像头,既可以使用0,也可以使用-1。
  • 捕获对象:为返回值,是cv2.VideoCapture类的对象。

视频处理完成之后,要记得释放摄像头对象。

该函数也能用于初始化视频文件,初始化视频文件时,参数为文件名。

捕获对象 = cv2.VideoCapture("文件名")

2、cv2.VideoCapture.open()和cv2.VideoCapture.isOpen()

一般使用cv2.VideoCapture()函数即可完成摄像头的初始化。有时,为了防止初始化错误,可以使用cv2.VideoCapture.isOpen()来检查初始化是否成功。该函数的语法格式为:

retval = cv2.VideoCapture.isOpen()
  • 如果成功,则retval为True
  • 如果失败,则retval为False

如果摄像头初始化失败,可以使用cv2.VideoCapture.open()打开摄像头。

retval = cv2.VideoCapture.open(摄像头ID号)
  • 成功打开,则retval为True

同样,这两个函数也能用于处理视频文件。语法格式为:

retval = retval = cv2.VideoCapture.open(filename)

3、捕获帧

摄像头初始化成功后,就可以从摄像头中捕获信息了。

捕获帧所使用的函数是cv2.VideoCapture.read()

retval, image = cv2.VideoCapture.read()
  • image:捕获到的帧,如果没有捕获到,则该值为空
  • retval:表示捕获是否成功,成功则为True,否则为False

4、释放

不需要摄像头时,要关闭摄像头,关闭摄像头的函数cv2.VideoCapture.release()

例如,当前有VideoCapture类的对象cap,要将其释放,可以使用语句:

cap.release()

5、属性设置

获取属性的函数:

retval = cv2.VideoCapture.get(propID)
  • propID对应着cv2.VideoCapture类对象的属性

修改类对象的属性:

retval = cv2.VideoCapture.set(propID, value)
  • propID对应着cv2.VideoCapture类对象的属性
  • value是新的值

例如:

cap = cv2.VideoCapture(0)
ret = cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)

将当前帧对象的宽度设置为640像素。

属性值及含义

属性值及含义(续)

6、cv2.VideoCapture.grab()函数和cv2.VideoCapture.retrtieve()函数

一般情况下,如果读取一个摄像头的数据,最简便的方法就是使用函数cv2.VideoCapture.read()

但是,如果需要同步一组或者一个多头摄像头的视频数据时,该函数就无法胜任了。

可以把cv2.VideoCapture.read()理解为由函数cv2.VideoCapture.grab()cv2.VideoCapture.retrtieve()组合而成。

cv2.VideoCapture.grab()用来指向下一帧,函数cv2.VideoCapture.retrtieve()用来解码并返回一帧。

cv2.VideoCapture.grab()的语法格式:

retval = cv2.VideoCapture.grab()

如果该函数成功指向下一帧,则返回retval为True。

cv2.VideoCapture.retrtieve()的语法格式:

retval, image = cv2.VideoCapture.retrieve()
  • image为返回的视频帧,若未成功,则返回一个空图像
  • retval为布尔数,成功返回True,失败返回False

对于一组摄像头,可以使用如下代码捕获不同摄像头的视频帧:

success0 = cameraCapture0.grab()
success1 = cameraCapture1.grab()
if success0 and success1:
    frame0 = cameraCapture0.retrieve()
    frame1 = cameraCapture1.retrieve()

捕获摄像头视频

import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(cap.isOpened()):
    ret,frame = cap.read()
    cv2.imshow('frame',frame)
    c = cv2.waitKey(1)
    if c == 27:  #ESC键
        break 
cap.release()
cv2.destroyAllWindows()

播放视频文件

播放视频文件,需要将函数cv2.VideoCapture()的参数设置为视频文件的名称。

在播放时,可以设置函数cv2.waitKey()中的参数值,来设置播放视频时每一帧的持续(停留)时间。

一般情况,设置为25即可。

import numpy as np
import cv2
cap = cv2.VideoCapture("madou.avi")
while(cap.isOpened()):
    ret,frame = cap.read()
    cv2.imshow('frame',frame)
    c = cv2.waitKey(25)
    if c == 27:
        break
cap.release()
cv2.destroyAllWindows()

博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/OpenCV57.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 26 日
如果觉得我的文章对你有用,请随意赞赏