赞
踩
-------2019/3/3
OpenCV提供了一个非常简单的接口用来使用视像头捕获实时图像。下面是使用摄像头获取一段视频,并将其转换成灰度视频显示出来。
为了获取视频,需要创建一个VideoCapture对象。他的参数可以是设备的索引号,或者是一个视频文件。设备索引号就是指定要使用的摄像头。对于笔记本来说,一般含有内置摄像头,所以参数就是0。可以通过设置成1或者其他来选择别的摄像头。之后,就可以一帧一帧的捕获视频了。注意:别忘了停止捕获视频。
import cv2 #创建捕获视频的变量 cap = cv2.VideoCapture(0) while(True): #一帧一帧地读取图像 ret, frame = cap.read() #对每一帧的操作 gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #显示 cv2.imshow('frame',gray) if cv2.waitKey(1) == ord('q'): break #当所有的事情完成之后,释放capture cap.release() cv2.destroyAllWindows()
当我们按下‘q’键时,停止捕获图像。
例如:可以使用cap.get(3)和cap.get(4)来查看每一帧的宽和高。默认情况下得到的值是640480.但是我们可以使用ret = cap.set(3,320)和ret = cap.set(4,240)来把宽和高改成320240。
param | 英文 | define |
---|---|---|
cv2.VideoCapture.get(0) | CV_CAP_PROP_POS_MSEC | 视频文件的当前位置(播放)以毫秒为单位 |
cv2.VideoCapture.get(1) | CV_CAP_PROP_POS_FRAMES | 基于以0开始的被捕获或解码的帧索引 |
cv2.VideoCapture.get(2) | CV_CAP_PROP_POS_AVI_RATIO | 视频文件的相对位置(播放):0=电影开始,1=影片的结尾 |
cv2.VideoCapture.get(3) | CV_CAP_PROP_FRAME_WIDTH | 在视频流的帧的宽度 |
cv2.VideoCapture.get(4) | CV_CAP_PROP_FRAME_HEIGHT | 在视频流的帧的高度 |
cv2.VideoCapture.get(5) | CV_CAP_PROP_FPS | 帧速率 |
cv2.VideoCapture.get(6) | CV_CAP_PROP_FOURCC | 编解码的4字-字符代码 |
cv2.VideoCapture.get(7) | CV_CAP_PROP_FRAME_COUNT | 视频文件中的帧数 |
cv2.VideoCapture.get(8) | CV_CAP_PROP_FORMAT | 返回对象的格式 |
cv2.VideoCapture.get(9) | CV_CAP_PROP_MODE | 返回后端特定的值,该值指示当前捕获模式 |
cv2.VideoCapture.get(10) | CV_CAP_PROP_BRIGHTNESS | 图像的亮度(仅适用于照相机) |
cv2.VideoCapture.get(11) | CV_CAP_PROP_CONTRAST | 图像的对比度(仅适用于照相机) |
cv2.VideoCapture.get(12) | CV_CAP_PROP_SATURATION | 图像的饱和度(仅适用于照相机) |
cv2.VideoCapture.get(13) | CV_CAP_PROP_HUE | 色调图像(仅适用于照相机) |
cv2.VideoCapture.get(14) | CV_CAP_PROP_GAIN | 图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升) |
cv2.VideoCapture.get(15) | CV_CAP_PROP_EXPOSURE | 曝光(仅适用于照相机) |
cv2.VideoCapture.get(16) | CV_CAP_PROP_CONVERT_RGB | 指示是否应将图像转换为RGB布尔标志 |
cv2.VideoCapture.get(17) | CV_CAP_PROP_WHITE_BALANCE | × 暂时不支持 |
cv2.VideoCapture.get(18) | CV_CAP_PROP_RECTIFICATION | 立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能) |
只需要将设备索引号改成视频文件的地址/名字。在播放每一帧时,使用cv2.waitKey()设置适当的持续时间。如果设置的太低,视频会播放的非常快,反之则会非常慢。通常情况下25毫秒即可。
我们要创建一个VideoWrtier的对象。我们应该确定一个输出文件的名字(可以包含保存路径)。接下来指定Fourcc编码。播放频率和帧的大小也都需要确定。最后一个是isColor标签。如果是True,每一帧都是彩色图,否则就是灰度图。
Fourcc就是一个4字节码,用来确定视频的编码格式。可用的编码列表可以从fourcc.org查到。fourcc码以下面的格式传给程序,以MJPG为例:
cv2.cv.FOURCC(‘M’,‘J’,‘P’,‘G’)或者cv2.cv.FOURCC(*‘MJPG’)
FourCC全称Four-Character Codes,代表四字符代码 (four character code), 它是一个32位的标示符,其实就是typedef unsigned int FOURCC;是一种独立标示视频数据流格式的四字符代码。
因此cv2.VideoWriter_fourcc()函数的作用是输入四个字符代码即可得到对应的视频编码器。
下面的代码是从摄像头捕获视频,沿水平方向旋转每一帧并保存。
import cv2 cap = cv2.VideoCapture(0) fourcc = cv2.VideoWriter_fourcc(*'XVID') #使用XVID编码器 out = cv2.VideoWriter('D://DL/img/output.avi',fourcc,20.0,(640,480)) #分别是:保存文件名、编码器、帧率、视频宽高 while(cap.isOpened()): ret,frame = cap.read() if ret == True: frame = cv2.flip(frame,0) out.write(frame) cv2.imshow('frame',frame) if cv2.waitKey(1) == ord('q'): break else: break cap.release() out.release() cv2.destroyAllWindows()
ret,frame = cap.read() cap.read() 按帧读取视频,ret,frame是获cap.read()方法的两个返回值。其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。
cv2.waitKey(1),waitKey() 方法本身表示等待键盘输入,
参数是1,表示延时1ms切换到下一帧图像,对于视频而言;
参数为0,如cv2.waitKey(0)只显示当前帧图像,相当于视频暂停,;
参数过大如cv2.waitKey(1000),会因为延时过久而卡顿感觉到卡顿。
c得到的是键盘输入的ASCII码,esc键对应的ASCII码是27,即当按esc键是if条件句成立
调用release()释放摄像头,调用destroyAllWindows()关闭所有图像窗口。
文章根据段力辉的《OpenCV-Python中文教程》,仅供学习/练习,侵删
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。