YOLOv8实时疲劳检测中音频无法实时播放的问题解决求助
基于YOLOv8的驾驶员疲劳检测实时报警问题解决
你的核心问题是**model.predict(source="0", show=True)为阻塞式执行**——它会单独启动一个独立的视频显示窗口,直到手动关闭该窗口才会返回检测结果;同时你又用cv2.VideoCapture(0)重复读取摄像头,导致检测逻辑与帧处理完全不同步,无法实时触发报警。
解决步骤:
- 统一摄像头输入:用
cap.read()获取的帧作为模型输入,避免重复开启摄像头流 - 手动控制帧显示:关闭
predict的show=True,改用cv2.imshow自行渲染帧,保证每帧处理逻辑同步 - 优化音频播放:增加状态变量避免重复播放导致的音频卡顿
修改后的完整代码:
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
相关产品推荐
相关产品推荐

