如何在YOLOv8中结合摄像头处理model.predict的检测结果?
解决方案:实时检测触发动作(Ultralytics YOLO)
方法1:自定义逐帧循环处理
不要直接调用阻塞式的model.predict(source=0),改成手动读取摄像头帧,逐帧预测并实时判断:
import cv2 from ultralytics import YOLO # 加载YOLO模型 model = YOLO('yolov8n.pt') # 打开默认摄像头(设备ID为0) cap = cv2.VideoCapture(0) while cap.isOpened(): # 读取单帧画面 success, frame = cap.read() if not success: break # 对当前帧执行预测,关闭冗余输出 results = model(frame, verbose=False) # 遍历检测结果,判断是否存在行人(YOLO默认类别ID 0对应person) for result in results: for box in result.boxes: cls_id = int(box.cls[0]) if cls_id == 0: # 此处写入你要触发的代码 print("检测到行人,执行动作!") # 示例:控制硬件、发送通知、记录日志等 # 可选:显示标注后的画面 annotated_frame = results[0].plot() cv2.imshow('实时检测画面', annotated_frame) # 按Q键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放资源 cap.release() cv2.destroyAllWindows()
方法2:使用YOLO回调函数
利用Ultralytics的回调机制,在每帧预测完成后自动触发自定义逻辑:
from ultralytics import YOLO def trigger_action_on_detection(predictor): # 获取当前帧的检测结果 results = predictor.results for result in results: for box in result.boxes: if int(box.cls[0]) == 0: # 检测到行人 print("检测到行人,触发指定代码!") # 执行你的业务逻辑 # 加载模型并注册回调 model = YOLO('yolov8n.pt') model.add_callback('on_predict_postprocess_end', trigger_action_on_detection) # 启动摄像头流预测,stream=True保持实时处理 model.predict(source=0, stream=True, verbose=False)
方法3:修正类别计数器的实时输出
如果坚持使用Ultralytics的ObjectCounter,可以改成逐帧实时获取计数结果:
from ultralytics import YOLO from ultralytics.solutions import object_counter model = YOLO('yolov8n.pt') # 初始化计数器 counter = object_counter.ObjectCounter() counter.set_args(view_img=True, classes_names=model.names, draw_tracks=True) # 逐帧处理摄像头流 for frame in model.predict(source=0, stream=True, verbose=False): annotated_frame = counter.start_counting(frame) # 实时获取行人数量(类别ID 0) person_count = counter.class_counts.get(0, 0) if person_count > 0: print(f"当前行人数量:{person_count},触发动作!") # 执行你的代码
关键提示
- 核心逻辑是避免阻塞式的一次性predict调用,改用逐帧处理或回调机制,确保每帧预测后能立即执行判断和触发动作。
- YOLO默认类别ID可通过
print(model.names)查看,person对应的ID为0。 - 设置
verbose=False可减少控制台冗余输出,避免干扰你的触发逻辑。
内容的提问来源于stack exchange,提问作者Alonso Martinez
相关产品推荐
相关产品推荐

