24 实践项目之实时物体检测

在本篇教程中,我们将深入探讨如何利用 OpenCV 实现实时物体检测。这是继我们上篇教程“车牌识别”之后的一个进阶项目,旨在让您对计算机视觉的应用有更深刻的理解。

项目概述

实时物体检测是计算机视觉中的一个重要领域,广泛应用于监控、自动驾驶和人机交互等场景。本项目将使用 OpenCV 和一个预训练的深度学习模型,您可以实时检测视频流中的物体(如行人、汽车和动物)。

环境准备

在开始之前,请确保您的系统中已安装 OpenCV 和 NumPy库。您可以通过以下命令安装:

1
pip install opencv-python numpy

此外,我们将使用一个常见的深度学习模型:YOLO(You Only Look Once)。请下载 YOLOv3 权重文件和配置文件,它们可以在 YOLO 的 GitHub 页面YOLO 官网 上找到。

实现步骤

  1. 加载 YOLO 模型

首先,我们需要加载 YOLO 模型的配置文件和权重文件。接下来的代码片段展示了如何完成这一步。

1
2
3
4
5
6
7
8
9
import cv2
import numpy as np

# 加载 YOLO 模型
net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")

# 获取层名称
layer_names = net.getLayerNames()
output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]
  1. 启动视频流

接着,我们将使用 OpenCV 提供的 VideoCapture 类来捕获实时视频流。

1
2
3
4
5
6
7
8
9
10
# 启动视频流
cap = cv2.VideoCapture(0) # 0 表示默认摄像头

while True:
# 读取视频流
ret, frame = cap.read()
if not ret:
break

height, width, _ = frame.shape
  1. 进行物体检测

在获取每一帧后,我们将通过 YOLO 模型进行物体检测。以下代码段展示了如何处理输入并获取检测结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 预处理输入数据
blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
net.setInput(blob)
detections = net.forward(output_layers)

boxes = []
confidences = []
class_ids = []

# 遍历检测结果
for detection in detections:
for obj in detection:
scores = obj[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]
if confidence > 0.5: # 置信度阈值
center_x = int(obj[0] * width)
center_y = int(obj[1] * height)
w = int(obj[2] * width)
h = int(obj[3] * height)

# 计算边界框
x = int(center_x - w / 2)
y = int(center_y - h / 2)

boxes.append([x, y, w, h])
confidences.append(float(confidence))
class_ids.append(class_id)
  1. 绘制检测边框

通过 NMS(非极大值抑制)去除重复检测后,我们将根据检测结果绘制边界框。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 应用非极大值抑制
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)

# 绘制边界框
for i in range(len(boxes)):
if i in indexes:
x, y, w, h = boxes[i]
label = str(classes[class_ids[i]])
color = (0, 255, 0)
cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)
cv2.putText(frame, label, (x, y + 30), cv2.FONT_HERSHEY_PLAIN, 3, color, 3)

# 显示结果
cv2.imshow("Real-time Object Detection", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
  1. 结束程序并释放资源

最后,我们要确保在完成检测后,正确释放视频流和窗口资源。

1
2
cap.release()
cv2.destroyAllWindows()

总结

通过本项目,我们学习了如何使用 OpenCV 和 YOLO 模型实现实时物体检测。此技术可以作为许多更加复杂应用的基础,比如自动驾驶、智能监控和机器人导航等。

在准备下一篇教程之前,您可以尝试修改阈值或添加更多的特征,以增强检测的效果和性能。感谢您的阅读,期待在下一篇关于“基于 OpenCV 的智能监控系统”的教程中与您再次相见!

24 实践项目之实时物体检测

https://zglg.work/opencv-tutorial/24/

作者

IT教程网(郭震)

发布于

2024-08-13

更新于

2024-08-13

许可协议

分享转发

复习上节

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论