如何获取YOLOv8目标检测模型识别对象的坐标?
解决YOLOv8检测坐标获取报错及实现裁剪逻辑
报错原因
你遇到的'list' object has no attribute 'xyxy'错误,核心是对YOLOv8推理结果的结构理解有误:
- YOLOv8的
infer()方法返回Results对象的列表,每个Results对应一张输入图片。 - 若你传入的
image_path是图片路径列表,或代码中误将结果嵌套处理,会导致遍历到的元素是普通列表而非Results对象,触发该报错。
修正后的代码及逻辑
以下是可直接用于获取指定类别坐标、实现图片裁剪的完整代码:
from ultralytics import YOLO import cv2 # 加载自定义训练模型 infer = YOLO(r'path_to_trained_model.pt') image_path = r'image' # 单张图片路径 results = infer(image_path) # 目标检测类别及置信度阈值 target_classes = ["Person", "Cat", "Dog"] confidence_threshold = 0.5 # 获取模型的类别名称映射(id -> 名称) class_names = infer.names # 遍历每张图片的检测结果 for result in results: # 读取原始图片用于后续裁剪 img = cv2.imread(image_path) # 遍历当前图片的所有检测框 for box in result.boxes: # 提取检测框的置信度、类别id和名称 conf = box.conf.item() cls_id = box.cls.item() cls_name = class_names[cls_id] # 过滤符合类别和置信度要求的框 if cls_name in target_classes and conf >= confidence_threshold: # 获取xyxy格式坐标(x1,y1为左上角,x2,y2为右下角) x1, y1, x2, y2 = box.xyxy[0].tolist() # 转换为整数像素坐标 x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2) # 执行图片裁剪 cropped_img = img[y1:y2, x1:x2] # 保存裁剪后的图片(可自定义命名规则) cv2.imwrite(f"{cls_name}_{conf:.2f}.jpg", cropped_img)
关键细节说明
result.boxes是当前图片所有检测框的集合,每个box包含坐标、置信度、类别等核心信息。box.xyxy返回张量格式数据,通过[0].tolist()可转换为普通列表类型的坐标值。- 必须将坐标转为整数,因为OpenCV的裁剪操作要求像素坐标为整数。
- 若输入为多张图片,只需将
image_path改为路径列表,代码会自动遍历处理每张图片的检测结果。
内容的提问来源于stack exchange,提问作者What
相关产品推荐
相关产品推荐

