热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本

文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定


文章目录

  • 引言
  • 开发环境和库
  • 流程设计
  • 张嘴和闭眼的检测


引言


(1) 利用 Dlib 官方训练好的模型 “shape_predictor_68_face_landmarks.dat” 进行 68 个点标定;
(2)利用 OpenCv 进行图像化处理,在人脸上画出 68 个特征点,并标明特征点的序号实现的 68 个特征点;
(3)根据得到的点位进行简单的活体检测



开发环境和库

1.Window10
2.Anaconda3
3.Python 3.6
4.dlib 19.8.1
5.opencv-python 4.2.0.32 (openCV只是用来画图)


PS:dlib 的pip install 可能需要加上版本号才能成功下载安装
pip install dlib==19.8.1


# -*- coding: UTF-8 -*-
import dlib
from skimage import io
from scipy.spatial import distance as dist
import matplotlib.pyplot as plt
import numpy as np
import cv2

流程设计


  1. 68 点提取:

借助 Dlib 官方的 Demo: face_landmark_detection.py,可以得到脸部 68 个特征点的坐标;



  1. OpenCv 绘图:

使用 opencv 中 画圆函数 cv2.circle() 和 画字符函数 cv2.putText() ;
静态图片的检测
在这里插入图片描述



张嘴和闭眼的检测

参考:Eye blink detection with OpenCV, Python, and dlib
公式很简单,就是欧式距离公式,设定好纵横比(EAR)。

def eye_aspect_ratio(eye):# 垂直眼标志(X,Y)坐标A = dist.euclidean(eye[1],eye[5])#计算两个集合之间的欧式距离B = dist.euclidean(eye[2],eye[4])#水平C = dist.euclidean(eye[0], eye[3])ear = (A+B) / (2.0 * C)return ear

def mouth_aspect_ratio(mouth):#垂直点位A = np.linalg.norm(mouth[2] - mouth[9])B = np.linalg.norm(mouth[4] - mouth[7])C = np.linalg.norm(mouth[0] - mouth[6])mar = (A + B) / (2.0 * C)return mar

还有可调试的常量

EYE_AR_THRESH = 0.2
EYE_AR_CONSEC_FRAMES = 2
MAR_THRESH = 0.5
MOUTH_AR_CONSEC_FRAMES = 3
COUNT = 0
TOTAL = 0
mCOUNT = 0
mTOTAL = 0
r_eye_ear = 0
l_eye_ear = 0

然后我们就可以把视频流的定帧数据输入到我们的函数里面解析,算出各个指标来判断是否触发张嘴闭眼。

cap = cv2.VideoCapture(0) #创建一个对象
cap.set(3,720)
isOpen = cap.isOpened() #检测是否开启
while isOpen:#cap.read()#返回两个值&#xff1a;#一个布尔值 true/false&#xff0c;用来判断读取视频是否成功/是否到视频末尾#图像对象&#xff0c;图像的三维矩阵flag,im_rd &#61; cap.read()# 每帧数据延时 1ms&#xff0c;延时为 0 读取的是静态帧k &#61; cv2.waitKey(1)img_gray &#61; cv2.cvtColor(im_rd, cv2.COLOR_RGB2GRAY)faces &#61; detector(img_gray, 0)font &#61; cv2.FONT_HERSHEY_SIMPLEX# 标点if len(faces) !&#61; 0:# 检测到人脸for i in range(len(faces)):landmarks &#61; np.matrix([[p.x, p.y] for p in landmark_predictor(im_rd, faces[i]).parts()])left_eye &#61; landmarks[42:48]right_eye &#61; landmarks[36:41]mouth_points &#61; landmarks[48:68]#print(left_eye)l_eye_ear &#61; eye_aspect_ratio(left_eye)r_eye_ear &#61; eye_aspect_ratio(left_eye)t_ear &#61; (l_eye_ear &#43;r_eye_ear) / 2.0mouth_ear &#61; mouth_aspect_ratio(mouth_points)if t_ear < 0.2:COUNT &#43;&#61; 1else:if COUNT >&#61; EYE_AR_CONSEC_FRAMES:TOTAL &#43;&#61; 1COUNT &#61; 0if mouth_ear > MAR_THRESH:mCOUNT &#43;&#61; 1else:if mCOUNT >&#61; MOUTH_AR_CONSEC_FRAMES:mTOTAL &#43;&#61; 1mCOUNT &#61; 0for idx,point in enumerate(landmarks):# 68点打印pos &#61; (point[0, 0], point[0, 1])#利用 cv2.circle 给每个特征点画一个圈&#xff0c;共 68 个cv2.circle(im_rd, pos, 2, color&#61;(139, 0, 0))# 利用 cv2.putText 输出 1-68#cv2.putText(im_rd, str(idx &#43; 1), pos, font, 0.2, (187, 255, 255), 1, cv2.LINE_AA)cv2.putText(im_rd, "faces: " &#43; str(len(faces)), (20, 20), font, 1, (255,20,147), 1, cv2.LINE_AA)#cv2.putText(im_rd, "L_Eye_Ear: " &#43; str(l_eye_ear), (20, 60), font, 1, (0, 0, 0), 1, cv2.LINE_AA)#cv2.putText(im_rd, "R_Eye_Ear: " &#43; str(r_eye_ear), (20, 90), font, 1, (0, 0, 0), 1, cv2.LINE_AA)cv2.putText(im_rd, "T_Ear: " &#43; str(t_ear), (20, 40), font, 1, (255,20,147), 1, cv2.LINE_AA)cv2.putText(im_rd, "BlinkNum: " &#43; str(TOTAL), (20, 80), font, 1, (255,20,147), 1, cv2.LINE_AA)cv2.putText(im_rd, "openMouth: " &#43; str(mTOTAL), (20, 100), font, 1, (255,20,147), 1, cv2.LINE_AA)else:cv2.putText(im_rd, "no face", (20, 50), font, 1, (0, 0, 0), 1, cv2.LINE_AA)cv2.putText(im_rd, "Press &#39;q&#39;: Quit", (20, 450),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,0,255),)cv2.namedWindow("camera", 0)cv2.imshow("camera", im_rd)if cv2.waitKey(1) & 0xFF &#61;&#61; ord(&#39;q&#39;):break
cap.release()
cv2.destroyAllWindows()

推荐阅读
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
author-avatar
萝莉控的小潴_515
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有