当前位置: 首页 > news >正文

opencv实战-人脸检测

一 人脸检测

进行获取数据包

1 传入参数

orderDict() 按照循序进行导入字典 拒绝乱序

访问方式

使用命名空间对象

使用字典(args

语法

args.shape_predictor

args["shape_predictor"]

动态访问

不方便

方便:args[key]

与函数集成

需要解包:func(**vars(args))

直接传递:func(**args)

遍历参数

需要vars()辅助

直接遍历

主要优势:字典格式更灵活,特别是当需要将参数传递给其他函数时。

FACIAL_LANDMARKS_68_IDXS = OrderedDict([ ("mouth", (48, 68)), # 嘴巴区域:关键点48-68 ("right_eyebrow", (17, 22)), # 右眉毛:关键点17-22 ("left_eyebrow", (22, 27)), # 左眉毛:关键点22-27 ("right_eye", (36, 42)), # 右眼:关键点36-42 ("left_eye", (42, 48)), # 左眼:关键点42-48 ("nose", (27, 36)), # 鼻子:关键点27-36 ("jaw", (0, 17)) # 下颌线:关键点0-17 ])
FACIAL_LANDMARKS_5_IDXS = OrderedDict([ ('right_eye', (2, 3)), # 右眼:索引2和3 ('left_eye', (0, 1)), # 左眼:索引0和1 ('nose', (4)) # 鼻子:索引4 ])

2 导入人脸检测的工具包并进行预处理

detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor(args["shape_predictor"]) • detector:这是您图片中被红框特别标注的核心对象。 它是一个使用方向梯度直方图(HOG)特征和线性SVM分类器的预训练人脸检测器。 它的作用是在图像中找出人脸的位置,返回一个或多个表示人脸位置的矩形框。 • predictor:这是一个预训练的关键点定位器,通常基于回归树集合或深度学习模型训练 。给定一个包含人脸的图像区域,它能精确预测出这个区域内68个 (或5个)​ 预先定义好的面部关键点的坐标。 工作关系:通常先使用 detector找到人脸,然后将每个人脸区域和原图(或灰度图) 传递给 predictor,以获得精细的关键点。

3 进行人脸检测并遍历所有的框

rects = detector(gray, 1) 返回值: rects:包含所有人脸边界框的列表 每个边界框是dlib的rectangle对象,包含人脸的位置 内部原理: detector使用HOG(方向梯度直方图)特征+SVM分类器 在图像上滑动窗口,检测人脸 参数1表示对图像上采样一次,增加检测小脸的能力
shape = predictor(gray, rect) predictor:加载的dlib关键点预测器。 参数:(gray, rect)- 当前帧的灰度图像和当前人脸框。 返回:一个dlib的full_object_detection对象,包含68个(或5个)面部关键点的坐标。 获取坐标值 coords = np.zeros((shape.num_parts, 2), dtype=dtype) shape.num_parts:获取关键点的总数 对于68点模型:68 对于5点模型:5 np.zeros((N, 2), dtype=dtype):创建N行2列的全零数组 示例:68点模型会创建形状为(68, 2)的数组
shape.part(i).x:获取第i个关键点的x坐标 shape.part(i).y:获取第i个关键点的y坐标 coords[i] = (x, y):将坐标赋值给数组的第i行

4 遍历每一个区域

用于提取感兴趣区域(Region of Interest)

(x,y,w,h)=cv2.boundingRect(np.array([shape[i:j]])) shape[i:j]:从关键点数组中提取特定区域的点 shape是关键点数组,形状为(68, 2)或(5, 2) i, j是特定区域的起始和结束索引 np.array([shape[i:j]]):将点列表转换为NumPy数组 cv2.boundingRect():计算能包围这些点的最小外接矩形 返回值: (x, y):矩形左上角坐标 (w, h):矩形的宽度和高度

5 展示所有区域

ull = cv2.convexHull(pts) 什么是凸包? 凸包是包含所有给定点的最小凸多边形。想象在木板上钉钉子, 用橡皮筋套住所有钉子形成的形状就是凸包。 参数详解: pts:关键点数组,形状为(N, 2),其中N是该区域的关键点数量 例如,右眼区域有6个点:pts = shape[36:42] 返回值hull:一个NumPy数组,包含凸包的顶点坐标

二 疲劳检测

1 求距离

dist.euclidean() 计算两点之间的欧几里得距离 EAR公式:(垂直距离1 + 垂直距离2) / (2 × 水平距离) 当眼睛完全睁开时,EAR值最大 当眼睛闭合时,EAR值接近0

2 设置参数

小于0.3的时候开始眨眼 当持续3帧的时候当一次眨眼

当小于0.3的时候counter加1 当counter加到3的时候total加1

3 需要将图像区域调大一些 这样方便检测到人脸 要不然人脸太小的化 人脸检测器检测不到

4 进行绘制

leftEye = shape[lStart:lEnd] lStart和 lEnd:左眼区域的起始和结束索引 对于68点模型,左眼通常是索引42-47 结果:包含6个(x, y)坐标的数组

cv2.putText(frame, "EAR: {:.2f}".format(ear), (300, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
关键区别:
位置:(300, 30),避免与眨眼计数重叠
格式:{:.2f}保留两位小数
内容:显示当前帧的眼睛纵横比
第6行:显示图像窗口

参数

说明

等待时间

10

等待10毫秒,然后继续

位掩码

& 0xFF

获取低8位,确保跨平台兼容

返回值

key

按键的ASCII码

http://www.cnnetsun.cn/news/656178.html

相关文章:

  • 用bhyve-webadmin来管理FreeBSD系统下的bhyve虚拟机(上)
  • SGLang性能对比实测:云端GPU 10元搞定3大模型评测
  • 为什么Sambert部署总失败?依赖修复镜像部署教程是关键
  • Python3.8图像处理:云端OpenCV预装,免去编译痛苦
  • Day 71:【99天精通Python】项目篇开篇 - 金融数据看板需求分析
  • Java Web web音乐网站系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • 语音机器人对话优化,根据用户情绪调整回复策略
  • AI写作大师Qwen3-4B进阶教程:自定义模型微调指南
  • Z-Image-Turbo_UI界面新手指南:零基础实现AI绘图全流程
  • 单目深度估计实战:MiDaS模型部署与优化
  • MinerU处理模糊PDF失败?源文件质量优化建议
  • Meta-Llama-3-8B-Instruct性能对比:不同硬件
  • 通义千问3-4B-Instruct-2507中文处理优势:C-Eval评测部署教程
  • GPT-OSS-20B-WEBUI操作手册:管理员后台管理功能
  • 用PyTorch-2.x-Universal-Dev镜像轻松实现AI模型训练与微调
  • Z-Image-Turbo多模态融合:文本+图像联合推理场景构建
  • BERT填空置信度不准?模型微调部署优化实战案例解析
  • BGE-Reranker-v2-m3为何选它?高精度rerank模型对比分析
  • Qwen2.5-0.5B-Instruct优化技巧:提升对话质量的实战方法
  • 零基础也能做!用GLM-TTS镜像快速实现方言语音合成
  • SAM3技术前沿:最新改进与应用趋势
  • DeepSeek-R1-Distill-Qwen-1.5B在电商场景的应用:智能客服搭建
  • YOLOv9论文复现:arXiv:2402.13616实验环境搭建指南
  • Qwen3-1.7B部署安全:API密钥管理与访问权限控制
  • 为什么AI智能二维码工坊总被推荐?镜像免配置实操手册揭秘
  • 图解说明Arduino Uno如何接入Home Assistant
  • FSMN-VAD能否用于电话录音?8kHz转16kHz处理方案
  • Whisper功能全测评:99种语言识别真实表现
  • 零基础也能用!Cute_Animal_Qwen镜像让儿童绘画创作超简单
  • Sambert多情感合成新手指南:预置环境打开就能用,零失败