GahooChan
GahooChan
Skip to content

口罩识别 + 自动消毒系统

编程教育期间的项目 · 2022 年上半年

起因

刚到机构不久,疫情还没完全过去,口罩还是每天进门的硬性要求。那时候我正在教乐高 EV3 系列的 Python 二次开发和 OpenCV 入门,就想把这两样东西串起来,做一个既跟课程相关、又有点实际意义的东西。

而且这些东西全是现成的——机构里就有 TP-Link 网络摄像头,局域网取流一开就能用;乐高 EV3 本身就是教具,机构有 12 套随便拿。零成本起步。

于是就有了这个系统——网络摄像头拍画面 → PC 端跑口罩检测 → EV3 根据不同结果播提示音 + 超声波检测到人手自动挤压酒精瓶消毒。一套完整的"感知 → 判断 → 执行"闭环。

整体思路

实现细节

图像采集与口罩检测

笔记本电脑通过机构 WiFi 接收网络摄像头的视频流。每帧画面下来后,用 OpenCV 加载一个网上下载的预训练 Haar Cascade 口罩检测分类器做推理:

python
import cv2
from ev3dev2.sound import Sound

# 加载口罩检测级联分类器(网上下载的预训练模型)
mask_cascade = cv2.CascadeClassifier('mask_detector.xml')
no_mask_cascade = cv2.CascadeClassifier('no_mask_detector.xml')

# 网络摄像头视频流
cap = cv2.VideoCapture('http://192.168.1.100:8080/video')  # 机构内网地址

# EV3 声音控制
sound = Sound()

while True:
    ret, frame = cap.read()
    if not ret:
        break

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 分别检测戴口罩和没戴口罩的人脸
    masked = mask_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
    unmasked = no_mask_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

    if len(masked) > 0:
        sound.play_song([(('C4', 'e'),), (('E4', 'e'),), (('G4', 'q'),)])  # 欢快三音
    elif len(unmasked) > 0:
        sound.play_song([(('C4', 'e'),), (('C4', 'e'),), (('C4', 'q'),)])  # 低沉提示

注:级联分类器是网上下载的预训练模型,不是自己训练的。它基于人脸检测的 Haar 特征,叠加口罩区域的特征来做分类,精度不算高但在当时够用了。

EV3 控制

通过 Python 的 ev3dev2 库与 EV3 主控器通信。PC 和 EV3 通过蓝牙配对连接,调用库封装的蓝牙协议发送指令:

python
from ev3dev2.motor import LargeMotor, OUTPUT_B, SpeedPercent
from ev3dev2.sensor.lego import UltrasonicSensor
from ev3dev2.sound import Sound

us = UltrasonicSensor()
motor = LargeMotor(OUTPUT_B)
sound = Sound()

while True:
    distance = us.distance_centimeters

    if distance < 10:  # 检测到手伸过来
        # 三连喷模式:连续下压三次,每次间隔一下
        for _ in range(3):
            motor.on_for_seconds(SpeedPercent(50), 1.5)   # 下压
            motor.on_for_seconds(SpeedPercent(-50), 1.5)  # 复位
        sound.play_song([(('E5', 'e'),), (('E5', 'e'),)])

机械结构:蜗轮蜗杆

选蜗轮蜗杆只有一个理由——扛得住回弹的应力。酒精瓶按压头下面有弹簧,压下去之后弹簧复位会产生很大的回弹力。齿轮齿条和连杆结构都顶不住这个应力,只有蜗轮蜗杆的自锁特性——蜗杆的螺旋面与蜗轮的齿面之间的摩擦角大于螺旋升角,输出端无论施加多大的力都推不动输入端——才能稳稳压住,等电机反转再复位。

技术栈

模块技术
图像采集网络摄像头 + 机构 WiFi
口罩检测OpenCV Haar Cascade(预训练分类器)
主控通信Python ev3dev2(蓝牙)
声音提示EV3 内置扬声器 + 内置提示音
距离检测EV3 超声波传感器
按压执行EV3 大电机 + 蜗轮蜗杆机构
开发语言Python

收获

  • 第一次把 OpenCV 图像识别和物理世界的执行器(电机、传感器)完整串起来
  • 实践了蜗轮蜗杆自锁特性在实际场景中的应用——课本上的知识变成能摸到的东西
  • 应了当时疫情最直接的场景,上课展示的时候学生和家长都觉得挺有用

评论 (0)

加载评论中...
0/500
👁️ 总访问量--
|
👥 访客数--