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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:12:10