CH05-动态图像的基础操作
1 捕获图像
1.1 cv2.VideoCapture 函数
| 语法 | 说明 |
|---|---|
| cap = cv2.VideoCapture(0) | 打开设备内置摄像头 |
| cap = cv2.VideoCapture(filepath) | 打开指定的本地视频文件 |
| ret, frame = cap.read() | ret:是否正确读取到了帧, frame:操作对象 |
| ret = cap.isOpened() | 摄像头是否处于打开状态 |
1.2 摄像头捕获视频
cap = cv2.VideoCapture(0) # 打开摄像头
while cap.isOpened(): # 当摄像头打开的时候
ret, frame = cap.read() # 读取当前摄像头的画面
cv2.imshow('img', frame) # 将画面显示在名为 img 的窗口画布上
if cv2.waitKey(1) == ord('q'): # 等待 1ms,如果在等待的时候接收到按 q 键操作
break
cv2.destroyAllWindows()
cap.release()
1.3 获取本地视频
cap = cv2.VideoCapture('video/video01.mp4')
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('img',gray)
# cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'): # 如果读者使用系统为 64 位的计算机,可以使用cv2.waitkey(1)&0xFF
break
cap.release()
cv2.destroyAllWindows()
1.4 cv2.VideoWriter 函数
cv2.VideoWriter(filename, FourCC, rate, size, isColor = True)
| 语法 | 说明 |
|---|---|
| filename | 输出的视频文件名字 |
| FourCC | 视频编码的一种格式 |
| rate | 视频播放的帧速率 |
| size | 每一帧的大小,为一个元祖 |
| isColor | 输出的视频是否为彩色,默认为 True |
FourCC是 openCV内置函数 cv2.VideoWriter_fourcc 返回的一个对象,cv2.VideoWriter_fourcc函数使用起来比较简单,它只有一个参数,即编码格式,是一个 4 字节码.不同的操作系统有不同的选择,对于 Fedora 而言,XVID 是非常好,MJPG 是高尺寸视频,X264 是小尺寸视频;对于 Windows来说,DIVX 是比较好的.
1.5 视频的保存
cap = cv2.VideoCapture(0)
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, 1)
out.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
1.5.1 图像翻转
cv2.flip(src, flipCode)
| 语法 | 说明 |
|---|---|
| src | 操作的原图 |
| flipCode | 控制如何翻转的操作码, -1 : 水平垂直翻转 0 : 垂直翻转 1 : 水平翻转 |
2. 物体追踪
2.1 图像的颜色空间转换
cv2.cvtColor(input_image, flag)
| 语法 | 说明 |
|---|---|
| input_image | 要转换的图像 |
| flag | BGR与灰度图的转换, cv2.COLOR_BGR2GRAY;BGR与 HSV 的相互转换,cv2.COLOR_BGR2HSV |
img = cv2.imread('img/CH04-1.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('img',img)
cv2.imshow('gray',gray)
print(img.shape)
print(gray.shape)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.2 构建掩膜
cv2.inRange 函数的作用是构建掩膜,这里构建的是浮动式掩膜,在浮动范围内的值被赋为 1,在浮动范围外的值被隔离开.
mask = cv2.inRange(src, lowerb, upperb)
| 语法 | 说明 |
|---|---|
| src | 原图像 |
| lowerb | 下阈值,为 Ndarray 的一个对象 |
| upperb | 上阈值,为 Ndarray 的一个对象 |
cap = cv2.VideoCapture(0)
while 1:
ret, frame = cap.read()
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
lower_blue = np.array([78, 43, 46])
upper_blue = np.array([99, 255, 255])
mask = cv2.inRange(frame, 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) == ord('q'):
break
cv2.destroyAllWindows()
2.3 找到要追踪的 HSV值
brown = np.uint8([[[130,187,218]]])
hsv_brown = cv2.cvtColor(brown, cv2.COLOR_BGR2HSV)
print(hsv_brown.shape)
hsv_brown = list(hsv_brown[0][0])
H = hsv_brown[0]
S = hsv_brown[1]
V = hsv_brown[2]
print("H:" + str(H))
print('S:' + str(S))
print('V:' + str(V))