本章的学习内容为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()