当前位置:   article > 正文

OpenCV-Python(1.2)_cap.read函数

cap.read函数

OpenCV-Python1.2 ------ 视频

                                                                                -------2019/3/3
  • 1

目标

  • 学习读取视频,显示视频,保存视频文件
  • 学会从摄像头获取并显示视频
  • 函数:cv2.VideoCapture(),cv2.VideoWrite()

用摄像头捕获视频

OpenCV提供了一个非常简单的接口用来使用视像头捕获实时图像。下面是使用摄像头获取一段视频,并将其转换成灰度视频显示出来。

为了获取视频,需要创建一个VideoCapture对象。他的参数可以是设备的索引号,或者是一个视频文件。设备索引号就是指定要使用的摄像头。对于笔记本来说,一般含有内置摄像头,所以参数就是0。可以通过设置成1或者其他来选择别的摄像头。之后,就可以一帧一帧的捕获视频了。注意:别忘了停止捕获视频。

import cv2

#创建捕获视频的变量
cap = cv2.VideoCapture(0)

while(True):
    #一帧一帧地读取图像
    ret, frame = cap.read()
    
    #对每一帧的操作
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    
    #显示
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) == ord('q'):
        break
    
#当所有的事情完成之后,释放capture
cap.release()
cv2.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

当我们按下‘q’键时,停止捕获图像。

  • cap.read()返回一个布尔值。如果读取的是正确的,就是True。所以可以通过检查他的返回值来检查视频文件是否已经到了结尾。
  • cap有时可能不能成功地初始化摄像头设备。这种情况下代码会报错。可以使用cap.isOpened()来检查是否成功初始化。若返回值是True,则成功,否则需要使用cap.open()。
  • cap.get(propld)可以获取视频的一些参数信息。propld可以是0到18的任何整数。每一个数代表视频的一个属性。其中的一些值可以使用cap.set(propld,value)来修改,value就是你想要设置成的新值。

例如:可以使用cap.get(3)和cap.get(4)来查看每一帧的宽和高。默认情况下得到的值是640480.但是我们可以使用ret = cap.set(3,320)和ret = cap.set(4,240)来把宽和高改成320240。

propld表
param英文define
cv2.VideoCapture.get(0)CV_CAP_PROP_POS_MSEC视频文件的当前位置(播放)以毫秒为单位
cv2.VideoCapture.get(1)CV_CAP_PROP_POS_FRAMES基于以0开始的被捕获或解码的帧索引
cv2.VideoCapture.get(2)CV_CAP_PROP_POS_AVI_RATIO视频文件的相对位置(播放):0=电影开始,1=影片的结尾
cv2.VideoCapture.get(3)CV_CAP_PROP_FRAME_WIDTH在视频流的帧的宽度
cv2.VideoCapture.get(4)CV_CAP_PROP_FRAME_HEIGHT在视频流的帧的高度
cv2.VideoCapture.get(5)CV_CAP_PROP_FPS帧速率
cv2.VideoCapture.get(6)CV_CAP_PROP_FOURCC编解码的4字-字符代码
cv2.VideoCapture.get(7)CV_CAP_PROP_FRAME_COUNT视频文件中的帧数
cv2.VideoCapture.get(8)CV_CAP_PROP_FORMAT返回对象的格式
cv2.VideoCapture.get(9)CV_CAP_PROP_MODE返回后端特定的值,该值指示当前捕获模式
cv2.VideoCapture.get(10)CV_CAP_PROP_BRIGHTNESS图像的亮度(仅适用于照相机)
cv2.VideoCapture.get(11)CV_CAP_PROP_CONTRAST图像的对比度(仅适用于照相机)
cv2.VideoCapture.get(12)CV_CAP_PROP_SATURATION图像的饱和度(仅适用于照相机)
cv2.VideoCapture.get(13)CV_CAP_PROP_HUE色调图像(仅适用于照相机)
cv2.VideoCapture.get(14)CV_CAP_PROP_GAIN图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
cv2.VideoCapture.get(15)CV_CAP_PROP_EXPOSURE曝光(仅适用于照相机)
cv2.VideoCapture.get(16)CV_CAP_PROP_CONVERT_RGB指示是否应将图像转换为RGB布尔标志
cv2.VideoCapture.get(17)CV_CAP_PROP_WHITE_BALANCE× 暂时不支持
cv2.VideoCapture.get(18)CV_CAP_PROP_RECTIFICATION立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)

从文件中播放视频

只需要将设备索引号改成视频文件的地址/名字。在播放每一帧时,使用cv2.waitKey()设置适当的持续时间。如果设置的太低,视频会播放的非常快,反之则会非常慢。通常情况下25毫秒即可。

保存视频

我们要创建一个VideoWrtier的对象。我们应该确定一个输出文件的名字(可以包含保存路径)。接下来指定Fourcc编码。播放频率和帧的大小也都需要确定。最后一个是isColor标签。如果是True,每一帧都是彩色图,否则就是灰度图。

Fourcc就是一个4字节码,用来确定视频的编码格式。可用的编码列表可以从fourcc.org查到。fourcc码以下面的格式传给程序,以MJPG为例:
cv2.cv.FOURCC(‘M’,‘J’,‘P’,‘G’)或者cv2.cv.FOURCC(*‘MJPG’)

FourCC全称Four-Character Codes,代表四字符代码 (four character code), 它是一个32位的标示符,其实就是typedef unsigned int FOURCC;是一种独立标示视频数据流格式的四字符代码。
因此cv2.VideoWriter_fourcc()函数的作用是输入四个字符代码即可得到对应的视频编码器。

下面的代码是从摄像头捕获视频,沿水平方向旋转每一帧并保存。

import cv2

cap = cv2.VideoCapture(0)

fourcc = cv2.VideoWriter_fourcc(*'XVID')  #使用XVID编码器
out = cv2.VideoWriter('D://DL/img/output.avi',fourcc,20.0,(640,480))  #分别是:保存文件名、编码器、帧率、视频宽高

while(cap.isOpened()):
    ret,frame = cap.read()
    if ret == True:
        frame = cv2.flip(frame,0)
        
        out.write(frame)
        
        cv2.imshow('frame',frame)
        if cv2.waitKey(1) == ord('q'):
            break
    else:
        break
        
cap.release()
out.release()
cv2.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

P.S.

ret,frame = cap.read() cap.read() 按帧读取视频,ret,frame是获cap.read()方法的两个返回值。其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。

cv2.waitKey(1),waitKey() 方法本身表示等待键盘输入,

参数是1,表示延时1ms切换到下一帧图像,对于视频而言;

参数为0,如cv2.waitKey(0)只显示当前帧图像,相当于视频暂停,;

参数过大如cv2.waitKey(1000),会因为延时过久而卡顿感觉到卡顿。

c得到的是键盘输入的ASCII码,esc键对应的ASCII码是27,即当按esc键是if条件句成立

调用release()释放摄像头,调用destroyAllWindows()关闭所有图像窗口。

文章根据段力辉的《OpenCV-Python中文教程》,仅供学习/练习,侵删

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号