Python+Dlib+Opencv实现人脸采集并表情判别功能的代码


Posted in Python onJuly 01, 2020

一、dlib以及opencv-python库安装

介于我使用的是jupyter notebook,所以在安装dlib和opencv-python时是在

Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

这个命令行安装的

dlib安装方法:

1.若可以,直接使用上图所示命令行输入以下命令:

pip install cmake

pip install boost

pip install dlib

若安装了visual studio2019应该就可以直接pip install dlib,至少我是这样

由于很多在执行第三句时都会报错,所以这里提供第二种办法

2.去dlib官网:http://dlib.net/ 或者 https://github.com/davisking/dlib 下载压缩包

下载完成后,解压缩

在安装dlib前需要安装Boost和Cmake,dlib19之后你需要安装vs2015以上的IDE,本人是安装的vs2019,(建议先安装好VS之后再安装Cmake和 boost)

Cmake安装

官网下载安装包:https://cmake.org/download/

我下的是

Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

直接安装之后,配置环境变量

Boost下载

安装boost:下载地址:http://www.boost.org/

Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

如果vs安装的是2015以上的版本,可以直接进行下一步,最好安装最新版本,不然会找不到b2命令

下载之后将其解压缩,进入boost_1_73_0文件夹中,找到bootstrap.bat批处理文件,双击运行,等待运行完成后(命令行自动消失)会生成两个文件b2.exe和bjam.exe

Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

然后将这两个文件复制到boost_1_73_0根文件夹下:
同样开启一个命令行,定位到这个文件夹,运行命令:

b2 install

这个安装需要一段时间,耐心等候。

利用b2编译库文件:

b2 -a ?with-python address-model=64 toolset=msvc runtime-link=static

之前你cmake下载的64位这里(address-model)写64,如果是32位的就把之前的64改成32

安装完成后配置boost环境变量

安装dlib

进入你的dlib解压路径,输入python setup.py install

成功之后会在文件夹中看见dlib和dlib.egg-info ,将这两个文件夹复制到你的python安装的目录下的Lib文件中:

—>例如我的python环境为python2.7,

—>所以将其放在python2-7文件夹的Python2-7\Lib\site-packages中

—>这时,就已经完成了dlib的配置

opencv-python安装方法

在Anaconda Prompt下输入以下命令

pip install opencv-python

但如果一直失败,建议在Anaconda Prompt下输入以下命令

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

二、dlib的68点模型

dlib的68点模型,使用网络上大神训练好的特征预测器,用来进行python代码人脸识别的特征预测。

三、Python实现人脸识别&表情判别

"""
从视屏中识别人脸,并实时标出面部特征点
"""
import sys
import dlib # 人脸识别的库dlib
import numpy as np # 数据处理的库numpy
import cv2 # 图像处理的库OpenCv
 
class face_emotion():
 def __init__(self):
  # 使用特征提取器get_frontal_face_detector
  self.detector = dlib.get_frontal_face_detector()
  # dlib的68点模型,使用作者训练好的特征预测器
  self.predictor = dlib.shape_predictor("F:/face.dat")
 
  # 建cv2摄像头对象,这里使用电脑自带摄像头,如果接了外部摄像头,则自动切换到外部摄像头
  self.cap = cv2.VideoCapture(0)
  # 设置视频参数,propId设置的视频参数,value设置的参数值
  self.cap.set(3, 480)
  # 截图screenshoot的计数器
  self.cnt = 0
 
 def learning_face(self):
 
  # 眉毛直线拟合数据缓冲
  line_brow_x = []
  line_brow_y = []
 
  # cap.isOpened() 返回true/false 检查初始化是否成功
  while (self.cap.isOpened()):
 
   # cap.read()
   # 返回两个值:
   # 一个布尔值true/false,用来判断读取视频是否成功/是否到视频末尾
   # 图像对象,图像的三维矩阵
   flag, im_rd = self.cap.read()
 
   # 每帧数据延时1ms,延时为0读取的是静态帧
   k = cv2.waitKey(1)
 
   # 取灰度
   img_gray = cv2.cvtColor(im_rd, cv2.COLOR_RGB2GRAY)
 
   # 使用人脸检测器检测每一帧图像中的人脸。并返回人脸数rects
   faces = self.detector(img_gray, 0)
 
   # 待会要显示在屏幕上的字体
   font = cv2.FONT_HERSHEY_SIMPLEX
 
   # 如果检测到人脸
   if (len(faces) != 0):
 
    # 对每个人脸都标出68个特征点
    for i in range(len(faces)):
     # enumerate方法同时返回数据对象的索引和数据,k为索引,d为faces中的对象
     for k, d in enumerate(faces):
      # 用红色矩形框出人脸
      cv2.rectangle(im_rd, (d.left(), d.top()), (d.right(), d.bottom()), (0, 0, 255))
      # 计算人脸热别框边长
      self.face_width = d.right() - d.left()
 
      # 使用预测器得到68点数据的坐标
      shape = self.predictor(im_rd, d)
      # 圆圈显示每个特征点
      for i in range(68):
       cv2.circle(im_rd, (shape.part(i).x, shape.part(i).y), 2, (0, 255, 0), -1, 8)
       # cv2.putText(im_rd, str(i), (shape.part(i).x, shape.part(i).y), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
       #   (255, 255, 255))
 
      # 分析任意n点的位置关系来作为表情识别的依据
      mouth_width = (shape.part(54).x - shape.part(48).x) / self.face_width # 嘴巴咧开程度
      mouth_higth = (shape.part(66).y - shape.part(62).y) / self.face_width # 嘴巴张开程度
      # print("嘴巴宽度与识别框宽度之比:",mouth_width_arv)
      # print("嘴巴高度与识别框高度之比:",mouth_higth_arv)
 
      # 通过两个眉毛上的10个特征点,分析挑眉程度和皱眉程度
      brow_sum = 0 # 高度之和
      frown_sum = 0 # 两边眉毛距离之和
      for j in range(17, 21):
       brow_sum += (shape.part(j).y - d.top()) + (shape.part(j + 5).y - d.top())
       frown_sum += shape.part(j + 5).x - shape.part(j).x
       line_brow_x.append(shape.part(j).x)
       line_brow_y.append(shape.part(j).y)
 
      # self.brow_k, self.brow_d = self.fit_slr(line_brow_x, line_brow_y) # 计算眉毛的倾斜程度
      tempx = np.array(line_brow_x)
      tempy = np.array(line_brow_y)
      z1 = np.polyfit(tempx, tempy, 1) # 拟合成一次直线
      self.brow_k = -round(z1[0], 3) # 拟合出曲线的斜率和实际眉毛的倾斜方向是相反的
 
      brow_hight = (brow_sum / 10) / self.face_width # 眉毛高度占比
      brow_width = (frown_sum / 5) / self.face_width # 眉毛距离占比
      # print("眉毛高度与识别框高度之比:",round(brow_arv/self.face_width,3))
      # print("眉毛间距与识别框高度之比:",round(frown_arv/self.face_width,3))
 
      # 眼睛睁开程度
      eye_sum = (shape.part(41).y - shape.part(37).y + shape.part(40).y - shape.part(38).y +
         shape.part(47).y - shape.part(43).y + shape.part(46).y - shape.part(44).y)
      eye_hight = (eye_sum / 4) / self.face_width
      # print("眼睛睁开距离与识别框高度之比:",round(eye_open/self.face_width,3))
 
      # 分情况讨论
      # 张嘴,可能是开心或者惊讶
      if round(mouth_higth >= 0.03):
       if eye_hight >= 0.056:
        cv2.putText(im_rd, "amazing", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX,
           0.8,
           (0, 0, 255), 2, 4)
       else:
        cv2.putText(im_rd, "happy", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
           (0, 0, 255), 2, 4)
 
      # 没有张嘴,可能是正常和生气
      else:
       if self.brow_k <= -0.3:
        cv2.putText(im_rd, "angry", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
           (0, 0, 255), 2, 4)
       else:
        cv2.putText(im_rd, "nature", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
           (0, 0, 255), 2, 4)
 
    # 标出人脸数
    cv2.putText(im_rd, "Faces: " + str(len(faces)), (20, 50), font, 1, (0, 0, 255), 1, cv2.LINE_AA)
   else:
    # 没有检测到人脸
    cv2.putText(im_rd, "No Face", (20, 50), font, 1, (0, 0, 255), 1, cv2.LINE_AA)
 
   # 添加说明
   im_rd = cv2.putText(im_rd, "S: screenshot", (20, 400), font, 0.8, (0, 0, 255), 1, cv2.LINE_AA)
   im_rd = cv2.putText(im_rd, "Q: quit", (20, 450), font, 0.8, (0, 0, 255), 1, cv2.LINE_AA)
 
   # 按下s键截图保存
   if (k == ord('s')):
    self.cnt += 1
    cv2.imwrite("screenshoot" + str(self.cnt) + ".jpg", im_rd)
 
   # 按下q键退出
   if (k == ord('q')):
    break
 
   # 窗口显示
   cv2.imshow("camera", im_rd)
 
  # 释放摄像头
  self.cap.release()
 
  # 删除建立的窗口
  cv2.destroyAllWindows()
 
if __name__ == "__main__":
 my_face = face_emotion()
 my_face.learning_face()

Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

四、参考文章

到此这篇关于Python+Dlib+Opencv实现人脸采集并表情判别的文章就介绍到这了,更多相关Python Dlib Opencv 人脸采集内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现高效求解素数代码实例
Jun 30 Python
python开发之函数定义实例分析
Nov 12 Python
python数据分析数据标准化及离散化详解
Feb 26 Python
浅述python2与python3的简单区别
Sep 19 Python
Scrapy使用的基本流程与实例讲解
Oct 21 Python
解决Python下imread,imwrite不支持中文的问题
Dec 05 Python
python 中的列表生成式、生成器表达式、模块导入
Jun 19 Python
Python 函数绘图及函数图像微分与积分
Nov 20 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
Feb 17 Python
Python类及获取对象属性方法解析
Jun 15 Python
python 自定义异常和主动抛出异常(raise)的操作
Dec 11 Python
基于注解实现 SpringBoot 接口防刷的方法
Mar 02 Python
python 实现两个npy档案合并
Jul 01 #Python
Python代码执行时间测量模块timeit用法解析
Jul 01 #Python
Python 存取npy格式数据实例
Jul 01 #Python
基于python实现音乐播放器代码实例
Jul 01 #Python
使用ITK-SNAP进行抠图操作并保存mask的实例
Jul 01 #Python
python使用nibabel和sitk读取保存nii.gz文件实例
Jul 01 #Python
.img/.hdr格式转.nii格式的操作
Jul 01 #Python
You might like
PHP源代码数组统计count分析
2011/08/02 PHP
浅谈php命令行用法
2015/02/04 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
php抛出异常与捕捉特定类型的异常详解
2016/10/26 PHP
js预载入和JavaScript Image()对象使用介绍
2011/08/28 Javascript
Javascript window对象详解
2014/11/12 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
利用JS轻松实现获取表单数据
2016/12/06 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
vue debug 二种方法
2018/09/16 Javascript
配置一个vue3.0项目的完整步骤
2019/04/26 Javascript
vue循环数组改变点击文字的颜色
2019/10/14 Javascript
python批量修改文件名的实现代码
2014/09/01 Python
使用Python编写Linux系统守护进程实例
2015/02/03 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
解决pycharm修改代码后第一次运行不生效的问题
2021/02/06 Python
HTML5语义化元素你真的用对了吗
2019/08/22 HTML / CSS
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
MCM英国官网:奢侈皮具制品
2017/04/18 全球购物
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
优秀村官事迹材料
2014/01/10 职场文书
中专生毕业个人鉴定
2014/02/26 职场文书
党员自我剖析材料范文
2014/10/06 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
小学教师个人总结
2015/02/05 职场文书
业务员岗位职责范本
2015/04/03 职场文书
员工手册编写范本
2015/05/14 职场文书
劳动仲裁调解书
2015/05/20 职场文书
心灵点滴观后感
2015/06/02 职场文书
新年祝酒词大全
2015/08/11 职场文书
文明上网主题班会
2015/08/14 职场文书
Jupyter notebook 更改文件打开的默认路径操作
2021/05/21 Python