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

如何在Python口罩检测项目中添加未戴口罩时通过扬声器触发的蜂鸣提醒功能?

实现方案

第一步:选择蜂鸣实现依赖

  • Windows系统:可直接使用系统自带的winsound模块,无需额外安装
  • 跨平台(Linux/macOS):可安装simpleaudio模块,执行pip install simpleaudio即可
    我们这里以兼容性最好的Windows自带方案为例,同时增加防重复触发逻辑,避免蜂鸣音连续播放过于嘈杂

第二步:核心改动说明

  1. 导入蜂鸣相关模块,新增蜂鸣间隔控制变量,避免短时间内重复响铃
  2. 在检测到No Mask(未佩戴口罩)状态时,满足时间间隔条件就触发蜂鸣

修改后的完整代码

from tensorflow.keras.applications.mobilenet_v2 import preprocess_input
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.models import load_model
from imutils.video import VideoStream
import numpy as np
import imutils
import time
import cv2
import os
# 新增导入:Windows自带蜂鸣模块
import winsound

# 蜂鸣控制参数:最短间隔2秒触发一次,避免连续响
BEEP_INTERVAL = 2
last_beep_time = 0

def detect_and_predict_mask(frame, faceNet, maskNet):
    (h, w) = frame.shape[:2]
    blob = cv2.dnn.blobFromImage(frame, 1.0, (224, 224),
        (104.0, 177.0, 123.0))
    faceNet.setInput(blob)
    detections = faceNet.forward()
    print(detections.shape)
    faces = []
    locs = []
    preds = []
    for i in range(0, detections.shape[2]):
        confidence = detections[0, 0, i, 2]
        if confidence > 0.5:
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            (startX, startY, endX, endY) = box.astype("int")
            (startX, startY) = (max(0, startX), max(0, startY))
            (endX, endY) = (min(w - 1, endX), min(h - 1, endY))
            face = frame[startY:endY, startX:endX]
            face = cv2.cvtColor(face, cv2.COLOR_BGR2RGB)
            face = cv2.resize(face, (224, 224))
            face = img_to_array(face)
            face = preprocess_input(face)
            faces.append(face)
            locs.append((startX, startY, endX, endY))
    if len(faces) > 0:
        faces = np.array(faces, dtype="float32")
        preds = maskNet.predict(faces, batch_size=32)
    return (locs, preds)


prototxtPath = r"face_detector\deploy.prototxt"
weightsPath = r"face_detector\res10_300x300_ssd_iter_140000.caffemodel"
faceNet = cv2.dnn.readNet(prototxtPath, weightsPath)
maskNet = load_model("mask_detector.model")
print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()
while True:
    frame = vs.read()
    frame = imutils.resize(frame, width=400)
    (locs, preds) = detect_and_predict_mask(frame, faceNet, maskNet)
    # 标记当前帧是否检测到未戴口罩
    has_no_mask = False
    for (box, pred) in zip(locs, preds):
        (startX, startY, endX, endY) = box
        (mask, withoutMask) = pred
        label = "Mask" if mask > withoutMask else "No Mask"
        if label == "No Mask":
            has_no_mask = True
        color = (0, 255, 0) if label == "Mask" else (0, 0, 255)
        label = "{}: {:.2f}%".format(label, max(mask, withoutMask) * 100)
        cv2.putText(frame, label, (startX, startY - 10),
        cv2.FONT_HERSHEY_SIMPLEX, 0.45, color, 2)
        cv2.rectangle(frame, (startX, startY), (endX, endY), color, 2)
    
    # 检测到未戴口罩且达到间隔时间,触发蜂鸣
    current_time = time.time()
    if has_no_mask and (current_time - last_beep_time) > BEEP_INTERVAL:
        # 1000Hz频率响200毫秒
        winsound.Beep(1000, 200)
        last_beep_time = current_time

    cv2.imshow("Frame", frame)
    key = cv2.waitKey(1) & 0xFF

    if key == ord("q"):
        break
cv2.destroyAllWindows()
vs.stop()

跨平台适配说明

如果是Linux/macOS系统,把import winsound和winsound.Beep(1000,200)替换为以下代码即可:

# 先安装依赖 pip install simpleaudio
import simpleaudio.functionchecks as fc
# 触发蜂鸣
fc.LeftRightCheck.run()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:36:04