热门标签 | 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()

推荐阅读
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
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社区 版权所有