目录
效果展示
玩手机检测
应用场景举例
1. 课堂或考试监控(看到这个学生党还会爱我吗)
应用场景:
-
在学校的 考试或课堂 过程中,自动检测学生是否在使用手机,防止考试作弊或上课玩手机。
-
教师可以使用该系统来提醒学生保持专注,提高课堂纪律。
优势:
✅ 非侵入式检测,无需学生主动上交手机。
✅ 实时监控,可以及时发现违规行为。
✅ 低成本部署,普通摄像头+计算机即可运行。
2. 驾驶安全监控(防止开车玩手机)
应用场景:
-
安装在 驾驶室 内部,用来检测司机是否在驾驶过程中使用手机。
-
适用于 出租车、货车、公交车 及私家车,提高行车安全。
优势:
✅ 预防分心驾驶,减少因玩手机导致的事故。
✅ 可以集成到ADAS(高级驾驶辅助系统),增强智能安全功能。
✅ 提供语音或视觉警告,提醒司机停止使用手机。
3. 企业办公管理(防止工作时间玩手机)
应用场景:
-
在企业办公区域监测 员工是否频繁使用手机,提高工作效率。
-
可用于 工厂流水线、客服中心、银行等,防止员工因使用手机影响工作。
优势:
✅ 自动检测,不影响正常工作。
✅ 可生成日志,统计员工的手机使用情况。
✅ 适用于不同工作环境,如流水线、办公室等。
4. 监狱、戒毒所、特殊场所安保
应用场景:
-
在 监狱、戒毒所、机密单位 监测是否有人私自使用手机,防止信息泄露或违规通信。
-
可安装在 监控摄像头系统 中,自动检测并报警。
优势:
✅ 防止非法通信,提升安保等级。
✅ 24小时自动监控,无需人工干预。
✅ 可结合人脸识别,锁定违规人员。
5. 家长监管(防止孩子沉迷手机)
应用场景:
-
家长可以在家中 设置摄像头,检测孩子是否长时间使用手机。
-
适用于 儿童学习、睡前管理、写作业时的监督。
优势:
✅ 自动提醒,减少孩子玩手机时间。
✅ 保护视力,防止长时间使用手机影响健康。
✅ 可设置提醒时间,比如晚上9点后检测到手机就提醒休息。
6. 公共场所提醒(图书馆、博物馆等)
应用场景:
-
在 图书馆、博物馆、会议室、电影院等 需要安静的环境下,提醒人们不要使用手机。
-
检测到使用手机后,系统可以 弹出提示 或 播放音频提醒。
优势:
✅ 提升公共场所秩序,减少干扰。
✅ 可以结合AI语音助手,自动发出提醒。
✅ 适用于不同场所,无需额外硬件成本。
7. 体育馆或健身房监督
应用场景:
-
在 健身房、体育馆 监督运动者是否在运动时过度使用手机。
-
适用于 健身房、瑜伽馆、篮球馆等,提高训练专注度。
优势:
✅ 帮助用户减少手机依赖,提升训练效果。
✅ 适用于健身教练管理学员训练状态。
✅ 可以结合数据分析,提供用户的运动专注度统计。
实现模块
YOLO(You Only Look Once)
-
主要作用:
YOLO是一种目标检测算法,它用于在图像中快速识别和定位特定类别的对象(例如手机)。在这段代码中,YOLO负责检测视频帧中的手机,并返回手机的边界框(即目标在图像中的位置和大小)。 -
实现原理:
-
单次前向传播: YOLO将整个图像一次性输入神经网络,网络会将图像划分成网格,并对每个网格预测多个边界框及其对应的类别概率。
-
实时检测: 由于只需要单次前向传播,因此速度非常快,适合实时应用。
-
输出信息: 模型输出包括边界框坐标、置信度得分以及预测类别,进而通过后处理筛选出满足条件的检测结果。
-
MediaPipe Hands
-
主要作用:
MediaPipe Hands是Google推出的手部关键点检测模块,专注于检测手部并提取关键点信息(例如手指、手掌的特定位置)。在这段代码中,MediaPipe主要用于检测手部,并提取食指指尖(关键点编号8)的坐标。 -
实现原理:
-
检测和追踪: MediaPipe使用经过训练的神经网络模型先检测手部,再对检测到的手部进行关键点定位。
-
高精度关键点提取: 模型能够输出手部各个关节点的精确坐标,使得后续能够计算手部各部分之间的相对位置和运动。
-
优化和实时性: 该模块经过高度优化,可以在移动设备和PC上实时运行,适用于视频流处理。
-
两者之间的合作使用
-
独立处理,同步运行:
在同一帧图像中,YOLO和MediaPipe分别对不同目标进行检测——YOLO检测手机,MediaPipe检测手部。两者互不干扰,各自独立完成自己的任务。 -
二者的信息整合:
-
目标定位: YOLO输出手机在图像中的边界框及中心点,而MediaPipe输出手部关键点(例如食指指尖)的位置。
-
行为判断: 后续代码将YOLO得到的手机中心点与MediaPipe检测到的手部关键点进行距离计算(欧氏距离),通过预设的距离阈值来判断用户是否在使用手机。
-
反馈结果: 根据距离的比较,程序在视频画面上显示不同的提示信息,实时反映用户是否可能在使用手机。
-
实现思路
YOLO物体检测和MediaPipe手部关键点检测,判断用户是否在使用手机。下面是详细的实现思路:
1. 模块初始化
-
YOLO模型
-
加载预训练的YOLO模型(此处使用的是YOLOv5su变体),用于在视频帧中检测手机。模型输出包含检测框的坐标、置信度以及类别信息(通过手机的中心点坐标来匹配)。
-
-
MediaPipe Hands
-
初始化MediaPipe的手部检测模块,配置检测模式、最大手数、检测和追踪的置信度。
-
MediaPipe会返回每只手的多个关键点坐标(例如食指指尖对应关键点编号8)。
-
2. 视频流读取
-
使用OpenCV打开默认摄像头,并循环读取每一帧图像。
3. 手机检测
-
图像预处理
-
将BGR图像转换为RGB(BGR代表蓝色、绿色和红色,而RGB代表红色、绿色和蓝色。这两种颜色空间的主要区别在于颜色通道的顺序。),因为MediaPipe要求输入RGB图像。
-
-
YOLO检测
-
使用YOLO模型对当前帧进行检测,遍历检测结果,筛选出类别为手机的目标。
-
YOLO 训练的数据集通常是 COCO,它包含 80 种常见物体的类别,每个类别都有一个 唯一的索引号。
在 COCO 数据集中:
"cell phone"
(手机)类别的索引是 67。人(person) → 类别索引 0
自行车(bicycle) → 类别索引 1
汽车(car) → 类别索引 2
书本(book) → 类别索引 73
-
对每个检测到的手机,提取边界框坐标并在图像上绘制矩形框和标签。
-
4. 手部检测
-
使用MediaPipe对RGB图像进行手部检测。
-
遍历检测到的手部,提取每只手中食指指尖(关键点8)的坐标。
-
在图像上绘制手部关键点和连接线,并在食指指尖处绘制一个圆点和文字标识。
5. 距离计算与判断
-
手机中心点计算
-
对于每个手机检测框,计算其中心点坐标。
-
-
欧氏距离计算
-
对于每个手部食指指尖坐标,计算其与手机中心点之间的欧氏距离。
-
在图像上显示每对点之间的距离数值,并根据距离绘制不同颜色的连线:
-
如果距离小于预设的阈值(50像素),认为用户可能正在使用手机,用红色标记;否则用蓝色标记。
-
-
-
状态判断
-
根据所有手与手机的距离判断,如果至少有一对距离小于阈值(我们这里的阈值为50个像素,可以根据不同的情况实施修改),则显示“Using Phone!!!Stop!!!”,否则显示“Not Using Phone”。
-
6. 显示与退出
-
将处理后的图像帧显示在窗口中。
-
通过监听键盘事件(ESC键)来实现退出循环和释放资源。
完整源码
import cv2
import mediapipe as mp
import numpy as np
from ultralytics import YOLO
# 初始化YOLO模型(预训练YOLOv5s模型)
model = YOLO("./yolov5spt/yolov5su.pt") # 确保当前目录有该模型文件或使用绝对路径
# 初始化MediaPipe Hands
mp_hands = mp.solutions.hands
hands_detector = mp_hands.Hands(
static_image_mode=False,
max_num_hands=2,
min_detection_confidence=0.5,
min_tracking_confidence=0.5
)
mp_drawing = mp.solutions.drawing_utils
# 距离阈值(单位:像素),需要根据实际情况调整
DISTANCE_THRESHOLD = 50
# 打开摄像头,这里的0就是默认的第一个摄像头
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 将图像转换为RGB供MediaPipe使用
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# YOLO检测手机,注意模型可能会检测出多个类别
# 得到 detections 结果为列表,包含检测框、置信度及类别信息
results = model(frame)
phone_boxes = []
for result in results:
# 解析检测结果(model返回的数据结构可能会变化,请参考ultralytics文档)
# 此处假设每个result.boxes对象内有xyxy, conf, cls属性
for box in result.boxes:
cls = int(box.cls[0])
# COCO数据集中,手机(cell phone)的类别大约为 67
# 这里根据具体模型类别索引进行调整
if cls == 67:
# 获取边界框坐标并转换为整型
x1, y1, x2, y2 = map(int, box.xyxy[0])
phone_boxes.append((x1, y1, x2, y2))
# 在图像上绘制手机检测框
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(frame, "Phone", (x1, y1 - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
# 使用MediaPipe检测手部
results_hands = hands_detector.process(frame_rgb)
hand_points = [] # 存放检测到的手部关键点(以食指指尖为例)
if results_hands.multi_hand_landmarks:
for hand_landmarks in results_hands.multi_hand_landmarks:
# 获取食指指尖 landmark,编号8(MediaPipe Hands的关键点编号)
h, w, _ = frame.shape
landmark = hand_landmarks.landmark[8]
cx, cy = int(landmark.x * w), int(landmark.y * h)
hand_points.append((cx, cy))
# 在图像上绘制手部关键点和连线
mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)
cv2.circle(frame, (cx, cy), 5, (0, 0, 255), -1)
cv2.putText(frame, "Index Tip", (cx, cy - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
# 检查每个手机框与手部关键点之间的距离
using_phone = False
for (x1, y1, x2, y2) in phone_boxes:
# 计算手机检测框中心点
phone_cx = (x1 + x2) // 2
phone_cy = (y1 + y2) // 2
cv2.circle(frame, (phone_cx, phone_cy), 5, (255, 0, 0), -1)
for (hx, hy) in hand_points:
# 计算欧氏距离
dist = np.sqrt((phone_cx - hx)**2 + (phone_cy - hy)**2)
# 在图像上显示距离值
cv2.putText(frame, f"{int(dist)}", ((phone_cx+hx)//2, (phone_cy+hy)//2),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 0), 2)
if dist < DISTANCE_THRESHOLD:
using_phone = True
# 用红色标记距离过近的情况
cv2.line(frame, (phone_cx, phone_cy), (hx, hy), (0, 0, 255), 2)
else:
cv2.line(frame, (phone_cx, phone_cy), (hx, hy), (255, 0, 0), 1)
# 显示结果
if using_phone:
cv2.putText(frame, "Using Phone!!!Stop!!!", (50, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
else:
cv2.putText(frame, "Not Using Phone", (50, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow("Phone and Hand Detection", frame)
# 按ESC退出
if cv2.waitKey(1) & 0xFF == 27:
break
cap.release()
cv2.destroyAllWindows()
总结
通过YOLO模型实时检测手机位置,再通过MediaPipe检测手部关键点,利用计算出的距离判断用户是否在使用手机,并将结果实时显示在视频画面上。这种方法融合了目标检测和关键点检测技术,适用于监控、驾驶安全提醒等场景。