现在的位置: 首页 > 人工智能 > 正文
dlib+opencv实现摄像头人脸68个关键点检测并标注【python版】
2019年07月16日 人工智能 ⁄ 共 2542字 暂无评论

dlib库的简介
    一个机器学习的开源库,包含了机器学习的很多算法,使用起来很方便,直接包含头文件即可,并且不依赖于其他库(自带图像编解码库源码)。Dlib可以帮助您创建很多复杂的机器学习方面的软件来帮助解决实际问题。目前Dlib已经被广泛的用在行业和学术领域,包括机器人,嵌入式设备,移动电话和大型高性能计算环境。

Dlib是一个使用现代C++技术编写的跨平台的通用库,遵守Boost Software licence. 主要特点如下: 
1.完善的文档:每个类每个函数都有详细的文档,并且提供了大量的示例代码,如果你发现文档描述不清晰或者没有文档,告诉作者,作者会立刻添加。 
2.可移植代码:代码符合ISO C++标准,不需要第三方库支持,支持win32、Linux、Mac OS X、Solaris、HPUX、BSDs 和 POSIX 系统 
3.线程支持:提供简单的可移植的线程API 
4.网络支持:提供简单的可移植的Socket API和一个简单的Http服务器 
5.图形用户界面:提供线程安全的GUI API 
6.数值算法:矩阵、大整数、随机数运算等 
7.机器学习算法:
8.图形模型算法: 
9.图像处理:支持读写Windows BMP文件,不同类型色彩转换 
10.数据压缩和完整性算法:CRC32、Md5、不同形式的PPM算法 
11.测试:线程安全的日志类和模块化的单元测试框架以及各种测试assert支持
12.一般工具:XML解析、内存管理、类型安全的big/little endian转换、序列化支持和容器类

 python3.6 下 dlib 的配置
dlib在python下的配置反反复复一直在折腾,一会说编码错误,一会又查资料说需要安装编译boost和Cmake等其他软件环境。反复查找资料后,这里给出一种简单快速地安装方法,不需要安装编译boost和Cmake等其他软件环境。

对应Anaconda的安装在这里不是重点,就不多说了。没有安装过的可以去找度娘。

第一步
使用Anaconda创建一个Python版本为3.6的Python环境。
创建python环境

第二步
在终端中打开环境。

打开终端

第三步
输入:

pip install dlib==19.7.0

注意:直接输入安装dlib可能会出错,因为可能最新版无whl格式的安装包,所以建议安装19.7.0版本,可以跳过安装boost和Cmake。

 

人脸检测 + 标注

利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68点标定,利用OpenCv进行图像化处理,在人脸上画出68个点,并标明序号;

设计流程
工作内容主要以下两大块:68点标定 和 OpenCv绘点

68点标定:
借助官方的训练模型实现;

dlib中为我们提供了关于人脸检测标注训练好的文件可在http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2下载 
(下载完成后解压到工程目录下)

OpenCv绘点:
介绍了用到的 画圆函数cv2.circle() 和 输出字符串函数 cv2.putText() ;

流程:
  1. 调用dlib库来进行人脸识别,调用预测器“shape_predictor_68_face_landmarks.dat”进行68点标定 
  2. 存入68个点坐标 
  3. 利用 cv2.circle 来画68个点 
  4. 利用 cv2.putText() 函数来画数字1-68

 

# _*_ coding:utf-8 _*_

import numpy as np
import cv2
import dlib
 
import time
# 人脸识别分类器
faceCascade = cv2.CascadeClassifier(r'C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')

# 识别眼睛的分类器
eyeCascade = cv2.CascadeClassifier(r'C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Lib\site-packages\cv2\data\haarcascade_eye.xml')

# 开启摄像头
cap = cv2.VideoCapture(0)
ok = True


detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')


while ok:
    # 读取摄像头中的图像,ok为是否读取成功的判断参数
    ok, img = cap.read()
    
    # 转换成灰度图像
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    rects = detector(img_gray, 0)
    
    for i in range(len(rects)):
        landmarks = np.matrix([[p.x, p.y] for p in predictor(img,rects[i]).parts()])
        for idx, point in enumerate(landmarks):
            # 68点的坐标
            pos = (point[0, 0], point[0, 1])
            print(idx,pos)
    
            # 利用cv2.circle给每个特征点画一个圈,共68个
            cv2.circle(img, pos, 2, color=(0, 255, 0))
            # 利用cv2.putText输出1-68
            font = cv2.FONT_HERSHEY_SIMPLEX
            cv2.putText(img, str(idx+1), pos, font, 0.2, (0, 0, 255), 1,cv2.LINE_AA)
    cv2.imshow('video', img)
    k = cv2.waitKey(1)
    if k == 27:    # press 'ESC' to quit
        break
    
cap.release()
cv2.destroyAllWindows()

给我留言

您必须 [ 登录 ] 才能发表留言!

×