2、视频

本章的学习内容为OpenCV中关于视频的操作

1、cv2.VideoCapture(parameter)

创建一个VideoCapture对象,用摄像头捕获一段视频,或者从文件读取一段视频

parameter:如果参数设置为0、1……则该函数从摄像头捕获一段视频,其中0为电脑的默认摄像头(笔记本电脑则为内置摄像头);如果参数设置为视频文件的路径,则该函数从文件读取一段视频

2、cap.read()

返回一个布尔值和一帧图像,可以通过检查它的返回值来查看视频文件是否已经到结尾

常见写法:ret, frame = cap.read()

其中ret是布尔值,frame是一帧图像对象

3、cap.isOpened()/cap.open()

cap.isOpened()返回一个布尔值,如果摄像头已经成功初始化了,则返回True,否则返回False

如果没有返回True,则使用cap.open()打开摄像头

4、cap.get(propId)/cap.set(propId, value)

cap.get(propId)用于获取视频的某些参数信息,而cap.set(propId, value)用于设置这些参数信息

以下为propId的值和对应的参数:

参数名 含义
CV_CAP_PROP_POS_MSEC 0 视频文件的当前位置(毫秒) 
CV_CAP_PROP_POS_FRAMES 1 下一个要解码或捕获的帧基于0帧的索引
CV_CAP_PROP_POS_AVI_RATIO 2 视频文件的相对位置:0—视频开始位置,1—视频结束位置
CV_CAP_PROP_FRAME_WIDTH 3 视频流中帧的宽度
CV_CAP_PROP_FRAME_HEIGHT 4 视频流中帧的高度 
CV_CAP_PROP_FPS 5  帧率
CV_CAP_PROP_FOURCC 6  4个字符表示的视频编码器格式
CV_CAP_PROP_FRAME_COUNT 7  视频文件中的帧数
CV_CAP_PROP_FORMAT 8  retrieve()返回的Mat对象的格式
CV_CAP_PROP_MODE 9  后端特定值,指示当前捕获模式
CV_CAP_PROP_BRIGHTNESS 10  图像亮度(仅针对摄像头)
CV_CAP_PROP_CONTRAST 11  图像对比度(仅针对摄像头)
CV_CAP_PROP_SATURATION 12  图像饱和度(仅针对摄像头)
CV_CAP_PROP_HUE 13  图像色调(仅针对摄像头)
CV_CAP_PROP_GAIN 14  图像增益(仅针对摄像头)
CV_CAP_PROP_EXPOSURE 15  图像曝光度(仅针对摄像头)
CV_CAP_PROP_CONVERT_RGB 16  指示图像是否应该转换为RGB的布尔标志。
CV_CAP_PROP_WHITE_BALANCE 17  目前不支持(此处按照文档翻译,目测为白平衡相关参数,现在应该已经支持了)
CV_CAP_PROP_RECTIFICATION 18  立体声摄像机校正标志(注:目前仅支持 DC1394 V2.x 后端)

5、cv2.VideoWriter(filename, fourcc, fps, frameSize[, isColor])

filename:要保存的文件的路径

fourcc:指定编码器

fps:要保存的视频的帧率

frameSize:要保存的文件的画面尺寸

isColor:可选参数,指示是黑白画面还是彩色的画面

6、cv2.VideoWriter_fourcc(fourcc)

*注意:此函数为OpenCV 3的写法,在OpenCV 2中写为cv2.cv.FOURCC()

fourcc:编码器,常用的编码器有"DIVX"、"MJPG"、"XVID"、"X264"等,具体可用列表在这个网站查询。编码器的格式为四字节无符号数值,可以写成(*'XVID')或('X', 'V', 'I', 'D')

以下为本章内容的总结代码

# -*- coding: utf-8 -*-
import cv2

cap = cv2.VideoCapture(0)                                       #调用摄像头
fourcc = cv2.VideoWriter_fourcc(*'MJPG')                        #以MJPG格式编码视频
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))   #保存为output.avi,帧率20,视频大小 640*480

while(cap.isOpened()):
    ret, frame = cap.read()                                     #获取一帧图像
    if ret == True:
        out.write(frame)                                        #保存一帧图像
        cv2.imshow('frame', frame)                              #展示一帧图像
        if cv2.waitKey(1) & 0xFF == ord('q'):                   #如果检测到输入了'q’,则停止捕获视频
            break
    else:
        break

cap.release()                                                   #释放资源
out.release()
cv2.destroyAllWindows()

猜你喜欢

转载自www.cnblogs.com/cheneyqn/p/12898677.html