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 27 Python
Python简单计算文件MD5值的方法示例
Apr 11 Python
Python实现的tcp端口检测操作示例
Jul 24 Python
浅谈Python的list中的选取范围
Nov 12 Python
python之生产者消费者模型实现详解
Jul 27 Python
python遍历文件目录、批量处理同类文件
Aug 31 Python
python网络编程之多线程同时接受和发送
Sep 03 Python
python接口自动化如何封装获取常量的类
Dec 24 Python
Pytorch 多维数组运算过程的索引处理方式
Dec 27 Python
基于Python的Jenkins的二次开发操作
May 12 Python
Python如何实现邮件功能
May 27 Python
Python中文纠错的简单实现
Jul 07 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
全国FM电台频率大全 - 29 青海省
2020/03/11 无线电
PHP应用JSON技巧讲解
2013/02/03 PHP
php删除左端与右端空格的方法
2014/11/29 PHP
php中smarty区域循环的方法
2015/06/11 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
javascript学习笔记(二) js一些基本概念
2012/06/18 Javascript
从jquery的过滤器.filter()方法想到的
2013/09/29 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
vue仿淘宝订单状态的tab切换效果
2020/06/23 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
JS滚轮控制图片缩放大小和拖动的实例代码
2018/11/20 Javascript
JavaScript实现多个物体同时运动
2020/03/12 Javascript
用VsCode编辑TypeScript的实现方法
2020/05/07 Javascript
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
Python设置Socket代理及实现远程摄像头控制的例子
2015/11/13 Python
Python字符串切片操作知识详解
2016/03/28 Python
python sys.argv[]用法实例详解
2018/05/25 Python
python+rsync精确同步指定格式文件
2019/08/29 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
python数据抓取3种方法总结
2021/02/07 Python
浅谈CSS3 box-sizing 属性 有趣的盒模型
2019/04/02 HTML / CSS
Raleigh兰令自行车美国官网:英国凤头牌自行车
2018/01/08 全球购物
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
巴西香水和化妆品购物网站:The Beauty Box
2019/09/03 全球购物
什么是.net
2015/08/03 面试题
毕业自我评价
2014/02/05 职场文书
十佳护士先进事迹
2014/05/08 职场文书
离婚协议书格式
2015/01/26 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
Java中的继承、多态以及封装
2022/04/11 Java/Android