如何在Python口罩检测项目中添加未戴口罩时通过扬声器触发的蜂鸣提醒功能?
实现方案
第一步:选择蜂鸣实现依赖
- Windows系统:可直接使用系统自带的
winsound模块,无需额外安装 - 跨平台(Linux/macOS):可安装
simpleaudio模块,执行pip install simpleaudio即可
我们这里以兼容性最好的Windows自带方案为例,同时增加防重复触发逻辑,避免蜂鸣音连续播放过于嘈杂
第二步:核心改动说明
- 导入蜂鸣相关模块,新增蜂鸣间隔控制变量,避免短时间内重复响铃
- 在检测到
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
相关产品推荐
相关产品推荐

