YOLOv8+OpenCV实时识别绘制边界框遇ValueError问题求助
解决YOLOv8实时检测中"ValueError: not enough values to unpack (expected 3, got 1)"错误
问题原因
你错误地将YOLOv8 model.predict() 的返回值直接拆解为classes, scores, boxes三个变量,但实际上该方法返回的是单个Results对象(或多帧的Results列表),而非三个独立的数组,因此触发“解包值不足”的错误。
修正步骤及完整代码
以下是修正后的代码,同时修复了其他潜在问题:
import cv2 from ultralytics import YOLO # 加载自定义YOLOv8模型 model = YOLO('best.pt') # 初始化摄像头 vid = cv2.VideoCapture(0) # 修正颜色列表格式(原格式是嵌套错误的元组) COLORS = [(0, 255, 25), (255, 255, 0), (0, 255, 0), (255, 0, 0)] # 替换为你训练模型时的类别名称,比如["cat", "dog", "person"] class_names = ["类别1", "类别2", "类别3"] while True: # 读取帧 ret, frame = vid.read() if not ret: break # 摄像头读取失败时退出循环 # 执行检测,获取Results对象 results = model.predict(frame, conf=0.25) # 遍历检测结果(单帧通常只有一个Results对象) for result in results: # 遍历每个检测框 for box in result.boxes: # 提取检测框信息 class_id = int(box.cls.item()) # 类别ID score = box.conf.item() # 置信度 # 获取边界框坐标(xyxy格式:x1, y1, x2, y2) x1, y1, x2, y2 = map(int, box.xyxy[0].tolist()) # 选择对应颜色 color = COLORS[class_id % len(COLORS)] # 生成标签文本 label = f"{class_names[class_id]}: {score:.2f}" # 绘制边界框 cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2) # 绘制标签(可选) cv2.putText(frame, label, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) # 显示帧 cv2.imshow('frame', frame) # 按q退出 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放资源 vid.release() cv2.destroyAllWindows()
关键改动说明
- 正确处理预测结果:通过
results = model.predict(...)获取Results对象,再从result.boxes中提取每个检测框的类别、置信度和坐标。 - 修复颜色列表:原
COLORS是嵌套错误的元组,改为包含多个RGB颜色元组的列表。 - 补充类别名称:
class_names需替换为你训练模型时定义的类别名称,否则会触发索引错误。 - 坐标转换:将YOLO返回的浮点型坐标转为整数,适配OpenCV的绘图要求。
- 增加摄像头读取失败判断:避免帧读取失败导致后续错误。
内容的提问来源于stack exchange,提问作者Vinicius Neves
相关产品推荐
相关产品推荐

