这次开始学习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时应确保安装了正确版本的ffmpeg 或gstreamer.
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()