从基础到实践 OpenCV (2)—读取视频流

1,549 阅读2分钟

这是我参与更文挑战的第 8 天,活动详情查看: 更文挑战

今天分享的是如何通过 OpenCV 读写视频流,以及通过局域网采集摄像头视频流。

读取视频流

import cv2
cap = cv2.VideoCapture(0)

这里 VideoCapture 方法参数 0 表示读取默认摄像头的视频流,如果使用 0 没有成功可尝试给 -1,当设备有两个摄像头可以通过 1 来得到第二个摄像头的视频流。

while(True):
    ret, frame = cap.read()
    cv2.imshow('frame',frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap 的 read 读取视频流方法会返回来两个返回值, ret 表示是否成功获取视频流,所以通常我们使用视频流图像也就是第二个返回值 frame,都需要对 ret 是否存在进行判断,而 frame 这是每一帧的画面,我们可以使用上一次分享介绍 imshow 方法将捕获画面显示出来,最后通过监听用户行为,判断用户是否按下 q 键,如果用户按下 q 键来执行退出循环。

cap.release()
cv2.destroyAllWindows()

退出循环后,还有做一些收尾工作,也就是需要释从内存中将 cap 对象进行释放。

读取视频流完整代码

import cv2
# -1 1
cap = cv2.VideoCapture(0)

while(True):
    ret, frame = cap.read()
    if ret is None:
      break
    cv2.imshow('frame',frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

我们也可以在输出每一帧画面前,对画面进行处理,这里通过 cvtColor 读取 frame 视频流根据指定第二个参数 cv2.COLOR_BGR2GRAY 将视频流数据转换为灰度图片

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

将图片处理为灰度图,使用了 cvtColor 方法来实现。然后通过 cap 的 isOpened 方法来判断是否成功开始捕获到图片。

while(cap.isOpened()):
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('frame',gray)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

通过 cap 实例也可以获取一些读取视频流的设置,还可以通过设置参数开控制输出读取视频流的视频的尺寸。

    print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
1280.0
720.0

保存图像

VideoWriter_fourcc 用来设置要保存视频的格式,可以一个一个字符输入,也可以以 * 开始输入这个字符串,两种方式如下。

fourcc = cv2.VideoWriter_fourcc('X','V','I','D')
fourcc = cv2.VideoWriter_fourcc(*'XVID')

使用 VideoWriter 读取视频流,第一个参数为要写入的文件,第二个参数为输出的视频的格式,

cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc,20.0,(1280,720))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret == True:
        
    # print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    # print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
        out.write(frame)
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        cv2.imshow('frame',gray)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
cap.release()
out.release()
cv2.destroyAllWindows()