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

YOLOv8中model.predict摄像头输入处理及结果触发代码问题

解决YOLO实时摄像头检测时获取结果并触发代码的问题

你遇到的核心问题是:使用摄像头作为输入源时,model.predict()会持续循环处理帧,不会主动终止,导致后续代码无法执行。其实不用多线程,利用YOLO的迭代器特性或者回调函数就能轻松解决。

方法一:遍历检测结果迭代器

model.predict()处理实时流(如摄像头)时,返回的是一个逐帧结果的迭代器,而非一次性返回所有结果。通过遍历这个迭代器,你可以在每帧处理完成后立即检查检测结果,触发对应逻辑。

from ultralytics import YOLO

model = YOLO("C:/Users/User/Downloads/best.pt")

# 遍历每帧的检测结果
for result in model.predict(source="0", show=True, verbose=False):
    # 获取当前帧的所有检测类别ID(转为numpy数组方便判断)
    class_ids = result.boxes.cls.cpu().numpy()
    
    # 替换为你需要触发的目标类别ID
    target_class_id = 0
    if target_class_id in class_ids:
        print("检测到目标对象!触发相关代码")
        # 在这里编写你的触发逻辑,比如调用函数、执行操作等

# 当关闭摄像头窗口(按q键)后,循环结束,后续代码会执行
print('hey')

方法二:使用回调函数

可以通过predict的callback参数传入自定义函数,每处理完一帧就自动调用该函数,在函数内处理检测结果并触发逻辑。

from ultralytics import YOLO

def handle_detection(result):
    # 处理单帧检测结果
    class_ids = result.boxes.cls.cpu().numpy()
    target_class_id = 0  # 替换为你的目标类别ID
    if target_class_id in class_ids:
        print("检测到目标,触发操作!")
        # 写入你的触发逻辑

model = YOLO("C:/Users/User/Downloads/best.pt")
# 传入回调函数,每帧处理后自动调用
model.predict(source="0", show=True, verbose=False, callback=handle_detection)

print('hey')

关键说明

  • 检测结果的核心信息都在result对象中:
    • result.names:类别ID与名称的映射字典
    • result.boxes.cls:每个检测框的类别ID(张量格式,需转numpy方便操作)
    • result.boxes.conf:每个检测框的置信度
    • result.boxes.xyxy:检测框的坐标(左上角、右下角)
  • 按下窗口的q键即可终止预测循环,执行后续代码。

内容的提问来源于stack exchange,提问作者Lookdatway

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:40:16