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实现的数据结构与算法之快速排序详解
Apr 22 Python
python模拟enum枚举类型的方法小结
Apr 30 Python
Python多进程并发(multiprocessing)用法实例详解
Jun 02 Python
win7上python2.7连接mysql数据库的方法
Jan 14 Python
Python编程实现控制cmd命令行显示颜色的方法示例
Aug 14 Python
Python使用progressbar模块实现的显示进度条功能
May 31 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
Apr 14 Python
Python基于DB-API操作MySQL数据库过程解析
Apr 23 Python
Python HTMLTestRunner库安装过程解析
May 25 Python
使用keras实现孪生网络中的权值共享教程
Jun 11 Python
Selenium环境变量配置(火狐浏览器)及验证实现
Dec 07 Python
python 实现客户端与服务端的通信
Dec 23 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维护文件系统
2006/10/09 PHP
php下连接mssql2005的代码
2011/01/17 PHP
php根据身份证号码计算年龄的实例代码
2014/01/18 PHP
php通过获取头信息判断图片类型的方法
2015/06/26 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
node.js中的fs.unlinkSync方法使用说明
2014/12/15 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
jQuery版本升级踩坑大全
2016/01/12 Javascript
探究Javascript模板引擎mustache.js使用方法
2016/01/26 Javascript
js中开关变量使用实例
2017/02/24 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
vue实现节点增删改功能
2019/09/26 Javascript
ant design vue datepicker日期选择器中文化操作
2020/10/28 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
python实现从web抓取文档的方法
2014/09/26 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
CentOS6.5设置Django开发环境
2016/10/13 Python
Python方法的延迟加载的示例代码
2017/12/18 Python
Python实现朴素贝叶斯分类器的方法详解
2018/07/04 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
python实现回旋矩阵方式(旋转矩阵)
2019/12/04 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
main 函数执行以前,还会执行什么代码
2013/04/17 面试题
TCP协议通讯的过程和步骤是什么
2015/10/18 面试题
员工自我鉴定
2013/10/09 职场文书
群众路线剖析材料
2014/02/02 职场文书
护理专科自荐书范文
2014/02/18 职场文书
个人承诺书怎么写
2014/05/24 职场文书
篮球社团活动总结
2014/06/27 职场文书
机关作风建设整改方案
2014/10/27 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL