dlib库的人脸检测案例实现
文章目录
- 前言
- 一、dlib 库简介
- 1、Dlib库优缺点
- 1)优点
- 2)缺点
- 二、安装 dlib 库
- 1、Python 环境安装
- 2、C++ 环境安装
- 三、案例实现(python)
- 1、对图片进行人脸识别
- 2、使用摄像头或对视频检测人脸
- 总结
前言
一、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 dlibdetector = dlib.get_frontal_face_detector() # 构造脸部位置检测器HOGcap = 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("不能读取摄像头")breakfaces = 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++ 版本下可能存在兼容性问题,安装和使用过程中遇到问题可以参考官方文档或社区论坛寻求解决方案。