热门标签 | 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对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • Python操作MySQL(pymysql模块)详解及示例代码
    本文介绍了使用Python操作MySQL数据库的方法,详细讲解了pymysql模块的安装和连接MySQL数据库的步骤,并提供了示例代码。内容涵盖了创建表、插入数据、查询数据等操作,帮助读者快速掌握Python操作MySQL的技巧。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 本文介绍了在Windows系统下安装Python、setuptools、pip和virtualenv的步骤,以及安装过程中需要注意的事项。详细介绍了Python2.7.4和Python3.3.2的安装路径,以及如何使用easy_install安装setuptools。同时提醒用户在安装完setuptools后,需要继续安装pip,并注意不要将Python的目录添加到系统的环境变量中。最后,还介绍了通过下载ez_setup.py来安装setuptools的方法。 ... [详细]
  • 本文总结了使用不同方式生成 Dataframe 的方法,包括通过CSV文件、Excel文件、python dictionary、List of tuples和List of dictionary。同时介绍了一些注意事项,如使用绝对路径引入文件和安装xlrd包来读取Excel文件。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
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社区 版权所有