📅  最后修改于: 2023-12-03 15:15:49.178000             🧑  作者: Mango
imutils 是 Python 中一个方便的图像处理工具库。其中比较常用的一个功能是视频流处理,可以从摄像头、视频文件等来源读取图像流,并进行实时处理。
本篇文章将介绍如何使用 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 提供了一个 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 库处理外部摄像头的视频流,包括缩放、边框检测和线性变换等功能。希望对读者有所帮助。