视频操作
目标- 打开摄像头并捕获照片
- 播放本地视频,录制视频
import cv2
import numpy as np
import matplotlib.pyplot as ply
打开摄像头
cv2.VideoCapture(0)
: 创建VideoCapture,对象,0是摄像头编号
windows系统下,采用dshow流媒体机制时需要使用cv2.CAP_DSHOW作为cv2.VideoCapture(0, cv2.CAP_DSHOW)的参数
capture = cv2.VideoCapture(0)
cv2.namedWindow("thresh", cv2.WINDOW_AUTOSIZE)
while(True):
ret, frame = capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 二值化
# _, thresh = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)
# 获取捕获的分辨率
# propId可以直接写数字,也可以用OpenCV的符号表示
width, height = capture.get(3), capture.get(4)
# print(width, height)
# 以原分辨率的一倍来捕获
capture.set(cv2.CAP_PROP_FRAME_WIDTH, width * 2)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, height * 2)
cv2.imshow('frame', frame)
# 灰度图
# cv2.imshow('gary', gray)
# cv2.imshow('thresh', thresh)
if cv2.waitKey(1) == 27:
break
capture.read()
函数返回的第一个参数是一个布尔值,表示当前这一帧是否获取正确。capture.get()
可以获取摄像头的一些属性capture.set()
可以修改这些属性值
参数 | 含义 |
---|---|
0:CV_CAP_PROP_POS_MSEC | 视频文件的当前位置(毫秒) |
1:CV_CAP_PROP_POS_FRAMES | 基于0的索引的下一个要解码/捕获的帧。 |
CV_CAP_PROP_POS_AVI_RATIO | 视频文件的相对位置:0-胶片开始,1-胶片结束。 |
CV_CAP_PROP_FRAME_WIDTH | 视频流中帧的宽度。 |
CV_CAP_PROP_FRAME_HEIGHT | 视频流中帧的高度。 |
CV_CAP_PROP_FPS | 帧速率。 |
CV_CAP_PROP_FOURCC | 编解码器的4字符代码。 |
CV_CAP_PROP_FRAME_COUNT | 视频文件中的帧数。 |
CV_CAP_PROP_FORMAT | 返回的Mat对象的格式。 |
CV_CAP_PROP_MODE | 后端特定值,指示当前捕获模式。 |
CV_CAP_PROP_BRIGHTNESS | 图像亮度(仅适用于相机) |
CV_CAP_PROP_CONTRAST | 图像对比度(仅适用于相机) |
CV_CAP_PROP_SATURATION | 图像的饱和度(仅适用于相机) |
CV_CAP_PROP_HUE | 图像的色调(仅适用于相机) |
CV_CAP_PROP_GAIN | 图像增益(仅适用于相机) |
CV_CAP_PROP_EXPOSURE | 曝光(仅适用于相机) |
CV_CAP_PROP_CONVERT_RGB | 指示是否应将图像转换为RGB的布尔标志。 |
CV_CAP_PROP_WHITE_BALANCE | 当前不支持 |
CV_CAP_PROP_RECTIFICATION | 立体相机的校正标志(注:仅DC1394 v 2.x后端当前支持) |
播放本地视频
把摄像头换成文件路径即可,cv2.waitKey()
的参数表示暂停的时间,一般为25或30.
capture = cv2.VideoCapture('/home/jokesnow/Videos/minzu.mp4')
while(capture.isOpened()):
ret, frame = capture.read()
cv2.imshow('frame', frame)
if cv2.waitKey(1) == 27:
break
录制视频
保存图片使用cv2.imwrite()
,保存视频我们需要创建一个VideoWriter
的对象,然后传给它四个参数:
- 输出的文件名
- 编码方式FourCC码
- FourCC是用来指定视频编码方式的四字节码。如MJPG编码可以这样写:
cv2.VideoWriter_fourcc(*'MJPG')
或cv2.VideoWriter_fourcc('M', 'j', 'p', 'G')
- 帧率FPS
- 要保存的分辨率大小
- FourCC是用来指定视频编码方式的四字节码。如MJPG编码可以这样写:
capture = cv2.VideoCapture(0)
# 定义编码方式并创建VideoWriter对象
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
outfile = cv2.VideoWriter('/home/jokesnow/Videos/output.avi', fourcc, 25., (640, 480))
while(capture.isOpened()):
ret, frame = capture.read()
if ret:
outfile.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) == 27:
break
else:
break
特定颜色物体追踪
步骤:
- 捕获视频中的一帧
- 从BGR转换到HSV
- 提取蓝色范围的物体
- 只显示蓝色物体
import numpy as np
capture = cv2.VideoCapture(0)
# 蓝色的范围
lower_blue = np.array([100, 100, 100])
upper_blue = np.array([130, 255, 255])
while(True):
# 捕获一帧
ret, frame = capture.read()
# 从BGR转换到HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# inRange():介于lower/upper之间的为白色,其余为黑色
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# 只保留蓝色
res = cv2.bitwise_and(frame, frame, mask=mask)
cv2.imshow('frame', frame)
cv2.imshow('mask', mask)
cv2.imshow('res', res)
if cv2.waitKey(1) == 27:
break
颜色HSV范围的获取:
blue = np.uint8([[[255, 0, 0]]])
red = np.uint8([[[0, 0, 255]]])
green = np.uint8([[[0, 255, 0]]])
hsv_blue = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)
hsv_green = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
hsv_red = cv2.cvtColor(red, cv2.COLOR_BGR2HSV)
print('b:', hsv_blue, 'g:', hsv_green, 'r:', hsv_red)
提取红绿蓝三种颜色
import numpy as np
capture = cv2.VideoCapture(0)
# 蓝色的范围
lower_blue = np.array([90, 100, 100])
upper_blue = np.array([140, 255, 255])
lower_green = np.array([40, 100, 100])
upper_green = np.array([80, 255, 255])
lower_red = np.array([0, 100, 100])
upper_red = np.array([30, 255, 255])
while(True):
ret, frame = capture.read()
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask_blue= cv2.inRange(hsv, lower_blue, upper_blue)
mask_green= cv2.inRange(hsv, lower_green, upper_green)
mask_red= cv2.inRange(hsv, lower_red, upper_red)
res1 = cv2.bitwise_and(frame, frame, mask=mask_blue)
res2 = cv2.bitwise_and(frame, frame, mask=mask_green)
res3 = cv2.bitwise_and(frame, frame, mask=mask_red)
res = res1 + res2 + res3
cv2.imshow('frame', frame)
cv2.imshow('mask_blue', mask_blue)
cv2.imshow('mask_green', mask_green)
cv2.imshow('mask_red', mask_red)
cv2.imshow('res', res)
if cv2.waitKey(1) == 27:
break