8

这次开始学习Getting Started with Videos

1从摄像头获取视频

使用cv2.VideoCapture()获取视频.

cv2.VideoCapture(builtins.object)

要获取视频,需要创建一个VideoCapture对象,参数可以是设备索引(摄像头索引)或视频文件的名称。如果是设备索引,当只连接一台摄像机时,可以是0或-1;也可以通过传递1来选择第二个摄像头。

我们设cap = cv2.VideoCapture(0)

cap.open()

打开cap

cap.isOpened()

检测cap是否初始化成功,如果返回True,则初始化成都,否则使用cap.open()打开cap

cap.read()
返回两个值
首先返回一个bool值,如果能正确读取帧,则为True,否则为False.可以通过检查该返回值来检查视频的结尾.
再返回一个值,为每一帧的图像,该值是一个三维矩阵

Note :如果使用一个变量接受两个值,frame = cap.read() 则 frame 为一个元组,原来使用 frame 处需更改为 frame[1]

cap.get(propld)

通过cap.get(propld)访问视频的某些功能,propld是0到18之间的数字。每个数字表示视频的属性。
比如:
cap.get(cv2.CAP_PROP_FRAME_WIDTH)和cap.get(cv2.CAP_PROP_FRAME_HEIGHT)得到帧宽和高度.
如果想修改为320x240.只需使用
ret = cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)和
ret = cap.set(cv2.CAP_PROP_FRAME_HEIGHT,240).

参数 propld 功能
cv2.CAP_PROP_POS_MSEC 0 视频文件的当前位置(以毫秒为单位)或视频捕获时间戳
cv2.CAP_PROP_POS_FRAMES 1 基于0的索引将被解码/捕获下一帧
cv2.CAP_PROP_POS_AVI_RATIO 2 视频文件的相对位置:0 - 视频的开始,1 - 视频的结束
cv2.CAP_PROP_FRAME_WIDTH 3 帧的宽度
cv2.CAP_PROP_FRAME_HEIGHT 4 帧的高度
cv2.CAP_PROP_FPS 5 帧速
cv2.CAP_PROP_FOURCC 6 4个字符表示的视频编码器格式
cv2.CAP_PROP_FRAME_COUNT 7 帧数
cv2.CAP_PROP_FORMAT 8 byretrieve()返回的Mat对象的格式
cv2.CAP_PROP_MODE 9 指示当前捕获模式的后端特定值
cv2.CAP_PROP_BRIGHTNESS 10 图像的亮度(仅适用于相机)
cv2.CAP_PROP_CONTRAST 11 图像对比度(仅适用于相机)
cv2.CAP_PROP_SATURATION 12 图像的饱和度(仅适用于相机)
cv2.CAP_PROP_HUE 13 图像的色相(仅适用于相机)
cv2.CAP_PROP_GAIN 14 图像的增益(仅适用于相机)
cv2.CAP_PROP_EXPOSURE 15 曝光(仅适用于相机)
cv2.CAP_PROP_CONVERT_RGB 16 表示图像是否应转换为RGB的布尔标志
cv2.CAP_PROP_WHITE_BALANCE 17
cv2.CAP_PROP_RECTIFICATION 18 立体摄像机的整流标志

应用

从摄像头获取视频,并将其转换为灰度视频并显示它.
代码 :

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'):#若检测到按键 ‘q’,退出
        break

# When everything done, release the capture
cap.release()#释放摄像头
cv2.destroyAllWindows()#删除全部窗口

Note :最后不要忘记release capture

1从文件获取视频

使用cv2.VideoCapture()获取视频.

cv2.VideoCapture(builtins.object)

与从摄像头获取视频相同,只是参数为视频文件的名称.

应用

代码 :

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()

Note :

  • 应为cv2.waitKey选择恰当的时间,如果设置太小,视频播放将非常快,如果设置太大,视频将显示慢动作,一般设置25毫秒.
  • 在使用Video Capture时应确保安装了正确版本的ffmpeggstreamer.

3保存视频

使用cv2.VideoWriter()保存视频.

cv2.VideoWriter()

首先创建一个VideoWriter对象并指定输出文件名(例如:output.avi)。然后指定FourCC代码。然后应该传递每秒帧数(fps)和帧大小。最后一个是isColor标志。如果是True,则编码器需要彩色帧,否则它适用于灰度帧。

FourCC
用于指定视频编解码器的4字节代码,可以在fourcc.org中找到可用代码列表。它取决于平台.

•在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2.(XVID更为可取.MJPG会产生高大小的视频.X264可以提供非常小的视频)
•在Windows中:DIVX(更多要测试和添加)
•在OSX中:MJPG(.mp4),DIVX(.avi),X264(.mkv)

FourCC代码通过cv2.VideoWriter_fourcc()传递
比如:
对于MJPG,FourCC代码作为cv2.VideoWriter_fourcc('M','J','P','G')cv2.VideoWriter_fourcc(*'MJPG')传递.

应用

从摄像头获取视频,在垂直方向上翻转每一帧并保存它.
代码 :

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()

sakurala
84 声望37 粉丝

目前正在学习以及巩固opencv-python知识.