如何用YOLOv8与Python获取检测目标名称并绘制边界框
YOLOv8目标检测:提取目标名称并绘制边界框
以下是实现获取检测目标名称+绘制边界框的完整可运行代码:
import cv2 from ultralytics import YOLO def main(): cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) model = YOLO("yolov8n.pt") while True: ret, frame = cap.read() if not ret: break # 执行检测 result = model(frame, agnostic_nms=True)[0] # 遍历所有检测到的边界框 for box in result.boxes: # 1. 获取类别ID和目标名称 # 将tensor类型的类别ID转为整数 cls_id = int(box.cls[0]) # 通过result.names字典映射得到目标名称 obj_name = result.names[cls_id] # 2. 获取边界框坐标(xyxy格式:左上x,左上y,右下x,右下y) x1, y1, x2, y2 = map(int, box.xyxy[0]) # 3. 获取置信度 conf = float(box.conf[0]) # 4. 绘制边界框和文本 # 画矩形框 cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) # 绘制目标名称+置信度文本 text = f"{obj_name}: {conf:.2f}" cv2.putText(frame, text, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0,255,0), 2) # 显示结果帧 cv2.imshow("YOLOv8 Detection", frame) # 按ESC退出 if cv2.waitKey(30) == 27: break cap.release() cv2.destroyAllWindows() if __name__ == "__main__": main()
关键步骤说明
- 获取目标名称:
result.boxes.cls返回tensor类型的类别ID数组,每个元素对应一个检测目标。通过int(box.cls[0])将单目标的类别张量转为整数ID,再用result.names[cls_id]即可拿到对应的目标名称(比如ID=0对应'person')。 - 提取边界框坐标:
box.xyxy[0]返回当前目标的边界框坐标(左上x、左上y、右下x、右下y),用map(int, ...)转为整数后直接传给cv2.rectangle绘制。 - 添加置信度文本:
把目标名称和格式化后的置信度(保留两位小数)组合成文本,用cv2.putText绘制在边界框上方。
补充说明
- 代码增加了
if not ret:判断,处理摄像头读取失败的异常情况。 - 保留原代码中的
agnostic_nms=True参数,用于消除不同类别目标的重复检测框。
内容的提问来源于stack exchange,提问作者Ganessa
相关产品推荐
相关产品推荐

