昨天opencv-python安装和图像的操作笔记链接:https://blog.youkuaiyun.com/Nyte2018/article/details/88649272
今天学习关于视频的操作
Capture Video from Camera
想要获取视频,先创建一个VideoCapture对象,参数为可区分摄像头即可,简单点选0,1之类。
来看下面一段代码:
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Our operations on the frame come here
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# Display the resulting frame
cv.imshow('frame',gray)
if cv.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()
cap.read():返回True或者False,即ret的值,如果能正确读出,就是true,因此这个函数搭配while(True)用来检测逐帧读视频有没有读完。frame代表每一帧的图片。当不能识别报错的时候,可以用cap.isOpened()来检测,如果返回True,则说明摄像头已打开,否则用cap.open()函数打开摄像头。
cap.get(propId):获取对象的特征,propld为0-18。每个数字代表video的一个特征(如果有这个特征的话)。
cap.set(propId, value):value为更改propld对应属性。
下面为propld表:
propld | 函数名 | 函数作用 |
---|---|---|
0 | cv.CAP_PROP_POS_MSEC | 以毫秒为单位获取视频现在的位置 |
1 | cv.CAP_PROP_POS_FRAMES | 基于0的帧获取下一帧 |
2 | cv.CAP_PROP_POS_AVI_RATIO | 视频相对位置,0代表开始,1代表结束 |
3 | cv.CAP_PROP_FRAME_WIDTH | 视频流中帧的宽度 |
4 | cv.CAP_PROP_FRAME_HEIGHT | 视频流中帧的高度 |
5 | cv.CAP_PROP_FPS | 帧速 |
6 | cv.CAP_PROP_FOURCC | 4个字符表示的视频编码器格式 |
7 | cv.CAP_PROP_FRAME_COUNT | 视频帧数 |
8 | cv.CAP_PROP_FORMAT | cv.VideoCapture.retrieve返回的Mat格式 |
9 | cv.CAP_PROP_MODE | 指示当前捕获模式的后端特定值 |
10 | cv.CAP_PROP_BRIGHTNESS | 图像的亮度(只适用于支持的相机) |
11 | cv.CAP_PROP_CONTRAST | 图像的对比度(只适用相机) |
12 | cv.CAP_PROP_SATURATION | 图像的饱和度(只适用相机) |
13 | cv.CAP_PROP_HUE | 图像的色相(只适用相机) |
14 | cv.CAP_PROP_GAIN | 图像的增益(只适用于支持的相机) |
15 | cv.CAP_PROP_EXPOSURE | 曝光(只适用于支持的相机) |
16 | cv.CAP_PROP_CONVERT_RGB | 图像是否能转变为RGM模式的布尔标志 |
17 | cv.CAP_PROP_WHITE_BALANCE_BLUE_U | 目前不支持 |
18 | cv.CAP_PROP_RECTIFICATION | 立体摄像机的整流标志(注意:目前只支持DC1394 v 2.x后端) |
cv.waitKey():等待键盘的输入,如果参数太小,视频会很快,反之会很慢,25毫秒比较正常。
cv.VideoWriter():保存视频。
下面来看一段代码:
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi',fourcc, 20.0, (640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
frame = cv.flip(frame,0)
# write the flipped frame
out.write(frame)
cv.imshow('frame',frame)
if cv.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()
解释:
fourcc = cv.VideoWriter_fourcc(‘XVID’):FourCC是代表四字符代码,视频播放软件通过查询 FourCC 代码并且寻找与 FourCC 代码相关联的视频解码器来播放特定的视频流。如MJPG可用cv.VideoWriter_fourcc(‘M’,‘J’,‘P’,‘G’)或者cv.VideoWriter_fourcc(‘MJPG’)表示。
cv.VideoWriter(filename, fourcc, fps, frameSize[, isColor]):视频存储函数。参数包括文件名,fourcc,每秒传输帧数,帧大小,isColor默认值为True,如果非零,编 码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)。
cv.flip( src, flipCode[, dst] ):图像翻转函数。flipCode:如何翻转图片,正数(比如1)代表关于y轴对称,0代表关于x轴对称,负数(比如-1)代表关于x,y对称。dst默认输出与原图片大小与类型相同。
ord(’’):将字符转换为ASCII数字。0xFF是十六进制常数。q的ASCII为113。cv2.waitKey(1) 与 0xFF(1111 1111)相与是因为cv2.waitKey(1) 的返回值不止8位,但是只有后8位实际有效,为避免产干扰,通过 ‘与’ 操作将其余位置0。