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))