dlib库的人脸检测案例实现


前言


一、dlib 库简介​

dlib 是一个包含机器学习算法和工具的跨平台 C++ 库,同时也提供了 Python 接口,方便开发者使用。它涵盖了图像操作、机器学习、数据挖掘等多个领域的功能。在人脸检测方面,dlib 内置了基于 HOG(Histogram of Oriented Gradients,方向梯度直方图)和级联分类器的检测器,以及更为先进的基于深度学习的 CNN(Convolutional Neural Network,卷积神经网络)检测器。这些检测器经过大量数据训练,能够在不同光照、姿态、表情等复杂条件下,准确地检测出人脸,为后续的人脸识别、表情分析等任务奠定了坚实的基础。

1、Dlib库优缺点

1)优点

• 适用于正面和略微非正面的人脸

• 语法极简单

• 再小的遮挡下仍可工作。

2)缺点

• 不能检测小脸,因为它训练数据的最小人脸尺寸为80×80,较小尺寸的人脸数据需自己训练检测器

• 边界框通常排除前额的一部分甚至下巴的一部分

• 不适用于侧面和极端非正面,如俯视或仰视。

二、安装 dlib 库​

在开始使用 dlib 库进行人脸检测之前,我们需要先完成库的安装。以下是在不同环境下的安装方法:​

1、Python 环境安装​

如果你使用的是 Python 环境,推荐使用pip进行安装。在命令行中执行以下命令:​

pip install dlib​


需要注意的是,在某些系统上,直接使用pip install dlib可能会遇到编译问题。此时,可以先安装cmake和boost库,然后再安装dlib。以 Ubuntu 系统为例,安装命令如下:​

sudo apt-get install cmake​
sudo apt-get install libboost-all-dev​
pip install dlib​

2、C++ 环境安装​

对于 C++ 开发者,首先需要从 dlib 的官方 GitHub 仓库下载源代码,地址为:https://github.com/davisking/dlib 。下载完成后,解压文件,进入 dlib 目录,执行以下命令进行编译和安装:​

mkdir build​
cd build​
cmake..​
make​
sudo make install​


完成上述步骤后,dlib 库就成功安装到你的系统中,可以开始使用它进行人脸检测开发了。

三、案例实现(python)

1、对图片进行人脸识别

import cv2
import dlib
 
 
# 使用HOG算法、线性分类器、金字塔图像结构和滑动窗口检测等技术。
# 比opencv提供的harr级联分类器效果更好
"""生成人脸检测器"""
detector = dlib.get_frontal_face_detector()   # 构造脸部位置检测器HOG
img = cv2.imread("people2.png")
 
# 参数:image:待检测的可能含有人脸的图像。
# 参数n:表示采用上采样的次数。上采样会让图像变大,能够检测到更多人脸对象,提高小人脸的检测效果
# #通常建议将此參数设置为0 或 1。较大的值会增加检测的准确性,但会降低处理速度。
# 返回值faces:返回检测图像中的所有人脸。
faces = detector(img,3)   # 使用构造的脸部位置检测器HOG对图像进行检测,3表示上采样次数
for face in faces:   # 对每个人脸框进行逐个处理
    # 获取人脸框的坐标
    x1 = face.left()   # 获取左边像素点的x坐标
    y1 = face.top()   # 获取上边界y坐标
    x2 = face.right()   # 右边界x坐标
    y2 = face.bottom()   # 下边界y坐标
    # 绘制人脸框
    cv2.rectangle(img,(x1,y1),(x2,y2),(0,255,0),2)
 
# 是不捕获到的各个人脸框
cv2.imshow("result",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

2、使用摄像头或对视频检测人脸

import cv2
import dlib
 
detector = dlib.get_frontal_face_detector()   # 构造脸部位置检测器HOG
 
cap = cv2.VideoCapture('笑容.mp4')   # 读取视频帧
# cap = cv2.VideoCapture(0)  # 打开摄像头
 
if not cap.isOpened():   # 如果打开失败
    print("Cannot open camera")
    exit()  # 终止程序
 
while True:  # 建立死循环,用来不停地读取视频的每一帧画面
    ret, image = cap.read()  # 读取视频帧,返回读入状态的布尔值和图片,一次读取一帧画面
    if not ret:  # 读取失败,则退出循环
        print("不能读取摄像头")
        break
 
    faces = detector(image,0)   # 使用脸部位置检测器对每一帧画面进行识别,0表示上采样次数
 
    for face in faces:   # 对每个人脸框进行逐个处理
        x1 = face.left()
        y1 = face.top()
        x2 = face.right()
        y2 = face.bottom()
        # 绘制人脸框
        cv2.rectangle(image,(x1,y1),(x2,y2),(0,255,0),2)
        
    # 展示捕获到的各个人脸框
    cv2.imshow("result",image)
    k = cv2.waitKey(20)   # 每一帧画面执行20毫秒
    if k == 27:   # 如果键盘点击esc键,终止循环
        break
cv2.destroyAllWindows()   # 关闭所有窗口释放资源

总结

注意事项​:

  • 模型文件路径:在使用 CNN 检测器时,要确保预训练模型文件的路径正确,否则会导致检测器加载失败。​
  • 图像格式要求:不同的检测器对输入图像格式有不同的要求,如 HOG 检测器通常在灰度图像上进行检测,而 CNN 检测器要求输入为 RGB 格式图像,使用时要注意图像格式的转换。​
  • 环境兼容性:dlib 库在不同操作系统和 Python/C++ 版本下可能存在兼容性问题,安装和使用过程中遇到问题可以参考官方文档或社区论坛寻求解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值