一、简介
树莓派自带多个 USB 口, 我们可以可以外接 USB 摄像头。 如果驱动支持, 默认会在系统的 /dev 下, 直接虚拟出来设备(video0、 video1…) 。 树莓派 opencv可以直接这个 video0 数据, 进行视频显示、 处理、 录制保存等功能(程序运行过程中, 因为程序锁定了虚拟视频设备, 拔插摄像头后, 这个序列号可能会改变,比如默认的 video0, 会变成 video1) 。
二、视频/摄像头基本操作函数
1、 创建 VideoCapture 对象
cap = cv2.VideoCapture(0) # 创建一个 VideoCapture 对象, 0 是指摄像头video0, 也可以改成文件名来引入视频文件。
2、释放摄像头或视频文件
cap.release() #释放对象, 再操作完成之后需要释放, 否则其他程序无法再次获取摄像头或者视频文件。
3、读取一帧数据
ret, frame = cap.read() #一帧帧读取数据给frame, 并返回一个布尔值( True/False) 并赋值给 ret。
注意啦,如果帧读取的是正确的, ret
就是 True。 所以最后你可以通过检查他的返回值来查看视频文件是否已经到了结尾。
有时 cap 可能不能成功的初始化摄像头设备。 这种情况下,上面的代码会报错。
你可以使用 cap.isOpened()
, 来检查是否成功初始化了。 如果返回值是 True, 那就没有问题。
否则就要使用函数 cap.open()
。
4、获取、 修改视频参数
ret = cap.get(propId) #获取视频对应 ID 的参数
ret = cap.set(propId,value) #修改视频对应 ID 的参数
propID 对应的名称及含义如下表所示:
propID | 名称 | 含义 |
---|---|---|
0 | CV_CAP_PROP_POS_MSEC | 视频文件的当前位置(毫秒) |
1 | CV_CAP_PROP_POS_FRAMES | 接下来要解码/捕获的帧的基于0的索引 |
2 | CV_CAP_PROP_POS_AVI_RATIO | 视频文件的相对位置:0-视频的开始,1-视频的结束。 |
3 | Width of the frames in the video stream | 视频流中帧的宽度 |
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 | 由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 Hue | 图片(仅适用于相机) |
14 | CV_CAP_PROP_GAIN | 图像增益(仅适用于相机) |
15 | CV_CAP_PROP_EXPOSURE | 曝光(仅适用于相机) |
16 | CV_CAP_PROP_CONVERT_RGB | 布尔标志,指示是否应将图像转换为RGB |
17 | CV_CAP_PROP_WHITE_BALANCE | 目前不支持 |
18 | CV_CAP_PROP_RECTIFICATION | 立体摄像机的整流标志(注意:当前仅受DC1394 v 2.x后端支持) |
5、截取灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #从帧图像 frame 中截取灰度图并赋值给 gray
6、设置视频格式
fourcc = cv.FOURCC('P','I','M','1')
设置编码格式为 MJPG 格式对应如下:
cv.FOURCC('P','I','M','1') = MPEG-1 codec
cv.FOURCC('M','J','P','G') = motion-jpeg codec (does not work well)
cv.FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
cv.FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
cv.FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
cv.FOURCC('U', '2', '6', '3') = H263 codec
cv.FOURCC('I', '2', '6', '3') = H263I codec
cv.FOURCC('F', 'L', 'V', '1') = FLV1 codec
#定义输出属性: 将一帧图像保存到名为 output.avi 的文件中
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
out.write(frame) #将帧文件 frame 按照 out 属性保存为视频文件
7、旋转图像
frame = cv2.flip(frame,0) #0:垂直反转; 1:水平翻转; -1:水平垂直翻转
三、代码示例
1、显示摄像头采集到的彩色视频,并实现按下键盘上的q
退出的功能。代码如下
# -*- coding: utf-8 -*-
import cv2
cap = cv2.VideoCapture(0)
while (cap.isOpened()):
ret,frame = cap.read() #capture frame_by_frame
if ret == True:
cv2.imshow('color',frame)#显示彩色视图
if cv2.waitKey(1)&0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
效果如下:
2、显示摄像头采集到的彩色图像,并保存!
# -*- coding: utf-8 -*-
import cv2
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output.avi',fourcc,20.0,(640,480))
while (cap.isOpened()):
ret,frame = cap.read() #capture frame_by_frame
if ret == True:
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
out.write(frame)#保存彩色视图
cv2.imshow('color',frame)#显示彩色视图
if cv2.waitKey(1)&0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
3、同时显示彩色图像和灰度图像!
# -*- coding: utf-8 -*-
import cv2
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output.avi',fourcc,20.0,(640,480))
while (cap.isOpened()):
ret,frame = cap.read() #capture frame_by_frame
if ret == True:
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#out.write(frame)#保存彩色视图
cv2.imshow('frame',gray)#显示灰度视图
cv2.imshow('color',frame)#显示彩色视图
if cv2.waitKey(1)&0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()