口罩识别 + 自动消毒系统
编程教育期间的项目 · 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)