1 Opencv-Python获取本机摄像头视频

1.1 视频捕获

  • 为了捕获本机摄像头的视频,需要创建一个VideoCapture对象,如果需要处理视频文件,则在构造对象时传入视频文件路径,如果需要捕获摄像头视频,则需要传入本机摄像头设备索引,如果电脑上只有一个摄像头,那么一般传入0,如果有多个摄像头,则根据需要传入响应摄像头的索引。
  • cap.read():通常返回一个布尔值,如果视频流能被正确读取,那么发挥True,如果视频流不能被正确读取则返回False。
  • cap.isOpened():检测cap是否初始化成功,如果返回True,则初始化成都,否则使用cap.open()打开cap
  • cap.get(propId)/cap.set(propId, value):可以用于获取视频/设置视频的一些属性,propId具体含义如下:
propId 参数 描述
0 cv2.CAP_PROP_POS_MSEC 视频文件的当前位置(以毫秒为单位)或视频捕获时间戳记
1 cv2.CAP_PROP_POS_FRAMES 接下来要解码/捕获的帧的基于0的索引
2 cv2.CAP_PROP_POS_AVI_RATIO 视频文件的相对位置:0-开始,1-结束
3 cv2.CAP_PROP_FRAME_WIDTH 视频流中帧的宽度
4 cv2.CAP_PROP_FRAME_HEIGHT 视频流中帧的高度
5 cv2.CAP_PROP_FPS 视频帧率
6 cv2.CAP_PROP_FOURCC 4个字符表示的视频编码器格式
7 cv2.CAP_PROP_FRAME_COUNT 视频总帧数
8 cv2.CAP_PROP_FORMAT byretrieve()返回的Mat对象的格式
9 cv2.CAP_PROP_MODE 当前的捕获模式
10 cv2.CAP_PROP_BRIGHTNESS 图像亮度(仅适用于相机)
11 cv2.CAP_PROP_CONTRAST 图像对比度(仅适用于相机)
12 cv2.CAP_PROP_SATURATION 图像饱和度(仅适用于相机)
13 cv2.CAP_PROP_HUE 图像的色相(仅适用于相机)
14 cv2.CAP_PROP_GAIN 图像增益(仅适用于相机)
15 cv2.CAP_PROP_EXPOSURE 曝光(仅适用于相机)
16 cv2.CAP_PROP_CONVERT_RGB 布尔标志,指示是否应将图像转换为RGB
17 cv2.CAP_PROP_WHITE_BALANCE
18 cv2.CAP_PROP_RECTIFICATION 立体摄像机的整流标志
19 cv2.CV_CAP_PROP_ISO_SPEED 相机的ISO感光度
20 cv2.CV_CAP_PROP_BUFFERSIZE 内部缓冲存储器中存储的帧数

1.2 视频写

保存视频使用的是VideoWriter对象,

VideoWriter(filename, fourcc, fps, frameSize, isColor)

  • filename : 需要保存的视频文件名
  • fourcc : 视频编码
  • fps : 自定义的视频帧率
  • frameSize : 视频帧分辨率
  • isColor : 黑白画面还是彩色的画面

其中fourcc可以通过以下方式创建:

fourcc = cv2.VideoWriter_fourcc('x', 'v', 'i', 'd')
fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
fourcc = cv2.VideoWriter_fourcc(*'xvid')

2 Opencv-Python捕获本机摄像头视频显示

# -*- coding: UTF-8 –*-
import cv2

cap = cv2.VideoCapture(0)

# 判断摄像头是否打开
while(cap.isOpened()):
    # 从摄像头获取帧数据
    ret, frame = cap.read()

    if ret:
        # 显示帧数据
        cv2.imshow('frame', frame)

        # 如果检测到了按键q则退出,不再显示摄像头并且保存视频文件
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

# 释放摄像头
cap.release()
# 删除全部窗口
cv2.destroyAllWindows()

3 Opencv-Python捕获本机摄像头视频并保存为视频

# -*- coding: UTF-8 –*-
import cv2

cap = cv2.VideoCapture(0)

camera_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
camera_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)

video_width = int(camera_width)
video_height = int(camera_height)

# 设置相机宽度
cap.set(cv2.CAP_PROP_FRAME_WIDTH,video_width)
# 设置相机高度
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,video_height)

# 设置视频编码,帧率,宽高
video_fourcc = cv2.VideoWriter_fourcc(*'XVID')
video_writer = cv2.VideoWriter(r'./output.avi', video_fourcc,30,(video_width,video_height))

# 判断摄像头是否打开
while(cap.isOpened()):
    # 从摄像头获取帧数据
    ret, frame = cap.read()

    if ret:
        # 显示帧数据
        cv2.imshow('frame', frame)

        # 向文件中写入帧数据
        video_writer.write(frame)

        # 如果检测到了按键q则退出,不再显示摄像头并且保存视频文件
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

# 释放摄像头
cap.release()
# 释放videowriter
video_writer.release()
# 删除全部窗口
cv2.destroyAllWindows()