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通过加号运算符操作列表的方法
Jul 28 Python
实例解析Python的Twisted框架中Deferred对象的用法
May 25 Python
Python实现在线音乐播放器
Mar 03 Python
Python实现的文本编辑器功能示例
Jun 30 Python
Python实现PS滤镜功能之波浪特效示例
Jan 26 Python
python实现学生信息管理系统
Apr 05 Python
python format 格式化输出方法
Jul 16 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
Aug 13 Python
Python @property使用方法解析
Sep 17 Python
详解Python IO口多路复用
Jun 17 Python
python 读txt文件,按‘,’分割每行数据操作
Jul 05 Python
baselines示例程序train_cartpole.py的ImportError
May 20 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.ini中的request_order推荐设置
2015/05/10 PHP
PHP程序中使用adodb连接不同数据库的代码实例
2015/12/19 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
2016/11/05 PHP
php自定义截取中文字符串-utf8版
2017/02/27 PHP
js实现的牛顿摆效果
2015/03/31 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
使用Node.js实现HTTP 206内容分片的教程
2015/06/23 Javascript
jQuery的position()方法详解
2015/07/19 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
JS实现的竖向折叠菜单代码
2015/10/21 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
2016/01/21 Javascript
Angular发布1.5正式版,专注于向Angular 2的过渡
2016/02/18 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
angular1.x ui-route传参的三种写法小结
2018/08/31 Javascript
JavaScript 实现自己的安卓手机自动化工具脚本(推荐)
2020/05/13 Javascript
js实现简单五子棋游戏
2020/05/28 Javascript
[34:27]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第一局
2016/02/26 DOTA
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
[01:11:35]Liquid vs LGD 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
python实现对一个完整url进行分割的方法
2015/04/29 Python
详解Python中用于计算指数的exp()方法
2015/05/14 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
Python 加密的实例详解
2017/10/09 Python
python如何使用unittest测试接口
2018/04/04 Python
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
2020/01/09 Python
jupyter notebook oepncv 显示一张图像的实现
2020/04/24 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
2020/06/01 Python
CSS3转换功能transform主要属性值分析及实现分享
2012/05/06 HTML / CSS
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
招聘单位介绍信
2014/01/14 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
贷款工作证明模板
2015/06/12 职场文书
基于Redis延迟队列的实现代码
2021/05/13 Redis