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

一、dlib以及opencv-python库安装

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

这个命令行安装的

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/

我下的是

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

Boost下载

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

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

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

然后将这两个文件复制到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()

四、参考文章

https://www.jb51.net/article/189876.htm

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

(0)

相关推荐

  • python+opencv实现霍夫变换检测直线

    本文实例为大家分享了python+opencv实现霍夫变换检测直线的具体代码,供大家参考,具体内容如下 python+opencv实现高斯平滑滤波 python+opencv实现阈值分割 功能: 创建一个滑动条来控制检测直线的长度阈值,即大于该阈值的检测出来,小于该阈值的忽略 注意:这里用的函数是HoughLinesP而不是HoughLines,因为HoughLinesP直接给出了直线的断点,在画出线段的时候可以偷懒 代码: # -*- coding: utf-8 -*- import cv2

  • Python检测数据类型的方法总结

    我们在用python进行程序开发的时候,很多时候我们需要检测一下当前的变量的数据类型.比如需要在使用字符串操作函数之前先检测一下当前变量是否是字符串.下面小编给大家分享一下在python中如何检测数据类型 首先我们打开CMD控制台,进入到python环境,然后声明一个列表,如下图所示 然后我们调用isinstance方法对列表变量进行类型判断,如下图所示,第二个参数是数据类型名称 然后我们调用isinstance方法对列表变量进行类型判断,如下图所示,第二个参数是数据类型名称 正确的检测出int

  • 详解opencv Python特征检测及K-最近邻匹配

    鉴于即将启程旅行,先上传篇简单的图像检索介绍,与各位一起学习opencv的同学共勉 一.特征检测 图片的特征主要分为角点,斑点,边,脊向等,都是常用特征检测算法所检测到的图像特征· 1.Harris角点检测 先将图片转换为灰度模式,再使用以下函数检测图片的角点特征: dst=cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]]) 重点关注第三个参数,这里使用了Sobel算子,简单来说,其取为3-31间的奇数,定义了角点检测的

  • python opencv实现图像边缘检测

    本文利用python opencv进行图像的边缘检测,一般要经过如下几个步骤: 1.去噪 如cv2.GaussianBlur()等函数: 2.计算图像梯度 图像梯度表达的是各个像素点之间,像素值大小的变化幅度大小,变化较大,则可以认为是出于边缘位置,最多可简化为如下形式: 3.非极大值抑制 在获得梯度的方向和大小之后,应该对整幅图像做一个扫描,去除那些非边界上的点.对每一个像素进行检查,看这个点的梯度是不是周围具有相同梯度方向的点中最大的.如下图所示: 4.滞后阈值 现在要确定那些边界才是真正的

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

    一.dlib以及opencv-python库安装 介于我使用的是jupyter notebook,所以在安装dlib和opencv-python时是在 这个命令行安装的 dlib安装方法: 1.若可以,直接使用上图所示命令行输入以下命令: pip install cmake pip install boost pip install dlib 若安装了visual studio2019应该就可以直接pip install dlib,至少我是这样 由于很多在执行第三句时都会报错,所以这里提供第二种

  • Python基于OpenCV实现人脸检测并保存

    本文实例为大家分享了Python基于OpenCV实现人脸检测,并保存的具体代码,供大家参考,具体内容如下 安装opencv 如果安装了pip的话,Opencv的在windows的安装可以直接通过cmd命令pip install opencv-python(只需要主要模块),也可以输入命令pip install opencv-contrib-python(如果需要main模块和contrib模块) 详情可以点击此处 导入opencv import cv2 所有包都包含haarcascade文件.这

  • python版opencv摄像头人脸实时检测方法

    OpenCV版本3.3.0,注意模型文件的路径要改成自己所安装的opencv的模型文件的路径,路径不对就会报错,一般在opencv-3.3.0/data/haarcascades 路径下 import numpy as np import cv2 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') cap = cv2.VideoCapture(0) while True: ret,img = ca

  • python调用OpenCV实现人脸识别功能

    Python调用OpenCV实现人脸识别,供大家参考,具体内容如下 硬件环境: Win10 64位 软件环境: Python版本:2.7.3 IDE:JetBrains PyCharm 2016.3.2 Python库: 1.1) opencv-python(3.2.0.6) 搭建过程: OpenCV Python库: 1. PyCharm的插件源中选择opencv-python(3.2.0.6)库安装 题外话:Python入门Tips PS1:如何安装whl文件 1.先安装PIP 2.CMD命

  • python利用Opencv实现人脸识别功能

    本文实例为大家分享了python利用Opencv实现人脸识别功能的具体代码,供大家参考,具体内容如下 首先:需要在在自己本地安装opencv具体步骤可以问度娘 如果从事于开发中的话建议用第三方的人脸识别(推荐阿里) 1.视频流中进行人脸识别 # -*- coding: utf-8 -*- import cv2 import sys from PIL import Image def CatchUsbVideo(window_name, camera_idx): cv2.namedWindow(w

  • python基于opencv实现人脸识别

    将opencv中haarcascade_frontalface_default.xml文件下载到本地,我们调用它辅助进行人脸识别. 识别图像中的人脸 #coding:utf-8 import cv2 as cv # 读取原始图像 img = cv.imread('face.png') # 调用熟悉的人脸分类器 识别特征类型 # 人脸 - haarcascade_frontalface_default.xml # 人眼 - haarcascade_eye.xml # 微笑 - haarcascad

  • python基于Opencv实现人脸口罩检测

    一.开发环境 python 3.6.6 opencv-python 4.5.1 二.设计要求 1.使用opencv-python对人脸口罩进行检测 三.设计原理 设计流程图如图3-1所示, 图3-1 口罩检测流程图 首先进行图片的读取,使用opencv的haar鼻子特征分类器,如果检测到鼻子,则证明没有戴口罩.如果检测到鼻子,接着使用opencv的haar眼睛特征分类器,如果没有检测到眼睛,则结束.如果检测到眼睛,则把RGB颜色空间转为HSV颜色空间.进行口罩区域的检测.口罩区域检测流程是首先把

  • python结合opencv实现人脸检测与跟踪

    模式识别课上老师留了个实验,在VC++环境下利用OpenCV库编程实现人脸检测与跟踪. 然后就开始下载opencv和vs2012,再然后,配置了好几次还是配置不成功,这里不得不吐槽下微软,软件做这么大,这么难用真的好吗? 于是就尝试了一下使用python完成实验任务,大概过程就是这样子的: 首先,配置运行环境: 下载opencv和python的比较新的版本,推荐opencv2.4.X和python2.7.X. 直接去官网下载就ok了,python安装时一路next就行,下载的opencv.exe

  • python使用opencv进行人脸识别

    环境 ubuntu 12.04 LTS python 2.7.3 opencv 2.3.1-7 安装依赖 sudo apt-get install libopencv-* sudo apt-get install python-opencv sudo apt-get install python-numpy 示例代码 #!/usr/bin/env python #coding=utf-8 import os from PIL import Image, ImageDraw import cv d

  • python通过opencv实现图片裁剪原理解析

    这篇文章主要介绍了python通过opencv实现图片裁剪原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 图像裁剪的基本概念 : 图像裁剪是指将图像中我们想要的研究区以外的区域去除,经常是按照行政区划或研究区域的边界对图像进行裁剪.例如,一张500×400的图像,我们只想要中间的250×200的区域,就可以使用图像裁剪将四周的区域去除. 在实际开发工作中,我们经常需要对图像进行分幅裁剪,按照ERDAS实际图像分幅裁剪的过程,可以将图像分

随机推荐