You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:12:42