在本篇教程中,我们将深入探讨如何利用 OpenCV 实现实时物体检测。这是继我们上篇教程“车牌识别”之后的一个进阶项目,旨在让您对计算机视觉的应用有更深刻的理解。
项目概述 实时物体检测是计算机视觉中的一个重要领域,广泛应用于监控、自动驾驶和人机交互等场景。本项目将使用 OpenCV 和一个预训练的深度学习模型,您可以实时检测视频流中的物体(如行人、汽车和动物)。
环境准备 在开始之前,请确保您的系统中已安装 OpenCV 和 NumPy库。您可以通过以下命令安装:
1 pip install opencv-python numpy
此外,我们将使用一个常见的深度学习模型:YOLO(You Only Look Once)。请下载 YOLOv3 权重文件和配置文件,它们可以在 YOLO 的 GitHub 页面 和 YOLO 官网 上找到。
实现步骤
加载 YOLO 模型
首先,我们需要加载 YOLO 模型的配置文件和权重文件。接下来的代码片段展示了如何完成这一步。
1 2 3 4 5 6 7 8 9 import cv2import numpy as npnet = cv2.dnn.readNet("yolov3.weights" , "yolov3.cfg" ) layer_names = net.getLayerNames() output_layers = [layer_names[i - 1 ] for i in net.getUnconnectedOutLayers()]
启动视频流
接着,我们将使用 OpenCV 提供的 VideoCapture
类来捕获实时视频流。
1 2 3 4 5 6 7 8 9 10 cap = cv2.VideoCapture(0 ) while True : ret, frame = cap.read() if not ret: break height, width, _ = frame.shape
进行物体检测
在获取每一帧后,我们将通过 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)
绘制检测边框
通过 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 2 cap.release() cv2.destroyAllWindows()
总结 通过本项目,我们学习了如何使用 OpenCV 和 YOLO 模型实现实时物体检测。此技术可以作为许多更加复杂应用的基础,比如自动驾驶、智能监控和机器人导航等。
在准备下一篇教程之前,您可以尝试修改阈值或添加更多的特征,以增强检测的效果和性能。感谢您的阅读,期待在下一篇关于“基于 OpenCV 的智能监控系统”的教程中与您再次相见!