📜  imutils 视频流外部摄像头 (1)

📅  最后修改于: 2023-12-03 15:15:49.178000             🧑  作者: Mango

使用 imutils 视频流外部摄像头

简介

imutils 是 Python 中一个方便的图像处理工具库。其中比较常用的一个功能是视频流处理,可以从摄像头、视频文件等来源读取图像流,并进行实时处理。

本篇文章将介绍如何使用 imutils 处理外部摄像头的视频流。

安装 imutils

使用 pip 进行安装:

pip install imutils
使用摄像头

首先,我们需要连接到摄像头并获取视频流。可以使用 OpenCV 库提供的 VideoCapture 方法来实现:

import cv2

# 定义摄像头 ID
camera_id = 0

# 创建 VideoCapture 对象,打开摄像头
cap = cv2.VideoCapture(camera_id)

# 当摄像头打开并且视频流有效时,持续读取图像
while cap.isOpened():
    # 读取帧
    ret, frame = cap.read()

    # 若未成功读取帧,退出循环
    if not ret:
        break

    # 对帧进行处理
    # ...

    # 显示帧
    cv2.imshow('frame', frame)
    
    # 若按下 q 键,则退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

上述代码中,camera_id 根据实际情况进行设置。一般情况下,0 表示外部摄像头,而 -1 表示主机内置摄像头。

在循环中,通过 cap.isOpened() 方法判断摄像头是否打开,并判断每次读取是否成功。若读取成功,则进行帧处理(这里使用了占位符),并通过 cv2.imshow() 显示当前帧。若按下 q 键,则退出循环。

最后,需要释放资源,包括释放摄像头和销毁所有窗口。

使用 imutils 处理图像流

之前的示例只是简单地读取摄像头并显示帧。接下来,我们将使用 imutils 库对帧进行处理。

缩放帧大小

imutils 提供了一个 resize() 方法,可以方便地缩放帧大小。使用该方法时,需要传递两个参数:帧和新的宽度。

import imutils

# 定义摄像头 ID
camera_id = 0

# 创建 VideoCapture 对象,打开摄像头
cap = cv2.VideoCapture(camera_id)

# 当摄像头打开并且视频流有效时,持续读取图像
while cap.isOpened():
    # 读取帧
    ret, frame = cap.read()

    # 若未成功读取帧,退出循环
    if not ret:
        break

    # 缩放帧大小
    new_width = 500
    frame = imutils.resize(frame, width=new_width)

    # 显示帧
    cv2.imshow('frame', frame)
    
    # 若按下 q 键,则退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

上述代码中,我们在读取每帧后对其进行大小缩放,新的宽度为 500。并在处理完成后进行显示。

边框检测

imutils 提供了多种边框检测方法,本文简单介绍其中的一些。

使用 findContours() 方法可以找到图像中的所有轮廓,并返回轮廓点的列表和层次结构。轮廓点是轮廓上的点集合,可以通过 drawContours() 方法绘制。

import imutils

# 定义摄像头 ID
camera_id = 0

# 创建 VideoCapture 对象,打开摄像头
cap = cv2.VideoCapture(camera_id)

# 当摄像头打开并且视频流有效时,持续读取图像
while cap.isOpened():
    # 读取帧
    ret, frame = cap.read()

    # 若未成功读取帧,退出循环
    if not ret:
        break

    # 边缘检测
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    edged = cv2.Canny(blurred, 50, 150)

    # 查找轮廓并绘制
    contours = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    contours = imutils.grab_contours(contours)
    cv2.drawContours(frame, contours, -1, (0, 255, 0), 2)

    # 显示帧
    cv2.imshow('frame', frame)
    
    # 若按下 q 键,则退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

上述代码中,我们首先使用 cv2.cvtColor() 方法将图像转换为灰度图,然后进行模糊化并进行边缘检测。接着,使用 cv2.findContours() 方法查找轮廓,并使用 cv2.drawContours() 方法绘制。

线性变换

imutils 还提供了一些线性变换函数,包括旋转、平移、缩放等。这些函数能够方便地对帧进行变换和修正。

import imutils

# 定义摄像头 ID
camera_id = 0

# 创建 VideoCapture 对象,打开摄像头
cap = cv2.VideoCapture(camera_id)

# 当摄像头打开并且视频流有效时,持续读取图像
while cap.isOpened():
    # 读取帧
    ret, frame = cap.read()

    # 若未成功读取帧,退出循环
    if not ret:
        break

    # 定义旋转角度和缩放因子
    angle = 45
    scale = 1.0

    # 旋转帧
    rotated = imutils.rotate_bound(frame, angle)

    # 缩放帧
    resized = imutils.resize(frame, width=int(frame.shape[1] * scale))

    # 显示帧
    cv2.imshow('rotated', rotated)
    cv2.imshow('resized', resized)

    # 若按下 q 键,则退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

上述代码中,我们定义了旋转角度和缩放因子,并分别使用 imutils.rotate_bound()imutils.resize()方法对帧进行变换。

结语

本篇文章介绍了如何使用 imutils 库处理外部摄像头的视频流,包括缩放、边框检测和线性变换等功能。希望对读者有所帮助。