如何在OpenCV中集成Ultralytics YOLOv8,获取边界框并同步监控类别及显示标注图?
OpenCV与YOLOv8集成实现检测需求解决方案
以下是满足你需求的完整代码,同时实现获取边界框坐标、在OpenCV窗口显示标注后图像、实时监控预测类别名称三个功能:
from ultralytics import YOLO import cv2 # 加载YOLOv8n模型 model = YOLO('yolov8n.pt') # 初始化摄像头 cap = cv2.VideoCapture(0) cap.set(3, 640) # 设置画面宽度 cap.set(4, 480) # 设置画面高度 while True: ret, frame = cap.read() if not ret: break # 模型预测(无需转换RGB,YOLOv8自动兼容OpenCV的BGR格式) results = model.predict(frame, verbose=False) # verbose=False关闭默认日志输出 for result in results: # 遍历每个检测框 for box in result.boxes: # 获取边界框坐标(xyxy格式:左上角x1,y1,右下角x2,y2) x1, y1, x2, y2 = map(int, box.xyxy[0]) # 获取类别索引和对应名称 cls_idx = int(box.cls[0]) cls_name = model.names[cls_idx] # 实时打印监控类别名称 print(f"检测到类别: {cls_name}") # 在图像上绘制边界框和类别标签 cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(frame, cls_name, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # 显示标注后的图像 cv2.imshow('YOLO V8 Detection', frame) # 按空格退出程序 if cv2.waitKey(1) & 0xFF == ord(' '): break # 释放摄像头资源并关闭窗口 cap.release() cv2.destroyAllWindows()
关键功能说明:
- 获取边界框坐标:通过
box.xyxy[0]直接获取检测框的左上角、右下角坐标,转换为整数后可用于后续处理。 - 显示标注后图像:用OpenCV的
cv2.rectangle绘制绿色边界框,cv2.putText添加类别标签,最后通过cv2.imshow展示处理后的画面。 - 监控类别名称:遍历检测框时,通过
model.names[cls_idx]映射得到类别名称并打印,实现实时监控。
优化点说明:
- 移除了不必要的
BGR2RGB格式转换,YOLOv8的predict方法支持直接传入OpenCV的BGR格式图像。 - 加入
verbose=False关闭模型默认的预测日志,避免干扰类别监控的打印信息。 - 增加
ret值判断,防止摄像头读取失败导致程序报错。
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

