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

YOLOv8实时疲劳检测中音频无法实时播放的问题解决求助

基于YOLOv8的驾驶员疲劳检测实时报警问题解决

你的核心问题是**model.predict(source="0", show=True)为阻塞式执行**——它会单独启动一个独立的视频显示窗口,直到手动关闭该窗口才会返回检测结果;同时你又用cv2.VideoCapture(0)重复读取摄像头,导致检测逻辑与帧处理完全不同步,无法实时触发报警。

解决步骤:

  1. 统一摄像头输入:用cap.read()获取的帧作为模型输入,避免重复开启摄像头流
  2. 手动控制帧显示:关闭predict的show=True,改用cv2.imshow自行渲染帧,保证每帧处理逻辑同步
  3. 优化音频播放:增加状态变量避免重复播放导致的音频卡顿

修改后的完整代码:

import os
from ultralytics import YOLO
import cv2
import pygame  

# 初始化音频模块
pygame.init()
sound_to_play = pygame.mixer.Sound(r'D:\ML\Syncronised vigilance for driver\alarm.wav')
is_playing = False  # 标记音频是否正在播放

# 加载YOLOv8模型
model = YOLO(r'C:\Users\HP\Downloads\last.pt')

# 初始化摄像头
cap = cv2.VideoCapture(0) 
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # 对当前帧进行检测,关闭模型内置的显示窗口
    results = model.predict(source=frame, show=False)  
    for r in results:
        if len(r.boxes.cls) > 0:
            dclass = r.boxes.cls[0].item()
            print(dclass)
            # 检测到疲劳类别(2.0)且音频未播放时,触发报警
            if dclass == 2.0 and not is_playing:
                sound_to_play.play()
                is_playing = True
        else:
            # 未检测到疲劳,重置播放状态并停止音频
            if is_playing:
                sound_to_play.stop()
                is_playing = False

    # 手动显示检测后的帧
    cv2.imshow('Driver Fatigue Detection', frame)
    # 按q键退出程序
    if cv2.waitKey(1) == ord('q'):
        break

# 释放所有资源
pygame.quit()
cap.release()
cv2.destroyAllWindows()

关键说明:

  • 用model.predict(source=frame)直接传入当前读取的帧,替代source="0",确保检测与帧读取完全同步
  • 改用cv2.imshow手动控制帧显示,实现每帧检测结果的实时判断与音频触发
  • 新增is_playing状态变量,避免重复调用play()导致的音频叠加卡顿,同时在未检测到疲劳时及时停止报警

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:41:21