OpenCV学习:dlib 人脸检测
前言 :上一篇我们学习了基于 OpenCV 的人脸识别。本篇我们将引入一个新的计算机视觉库------dlib,学习它在人脸检测中的应用。dlib 使用 HOG 特征 + 线性分类器,检测效果优于 OpenCV 的 Haar 级联分类器,是人脸检测与关键点检测的常用工具。
目录
- 一、dlib 库简介
- 二、dlib 环境搭建
- 三、dlib 图片人脸检测
- 四、dlib vs OpenCV 人脸检测对比
- 五、总结
一、dlib 库简介
1.1 什么是 dlib?
dlib 是一个现代化的 C++ 工具库,包含机器学习算法和计算机视觉工具。在 Python 中可以通过 pip 安装使用。dlib 在人脸检测和人脸关键点检测方面精度更高。
1.2 dlib 人脸检测原理
dlib 的 get_frontal_face_detector() 基于以下技术:
| 技术 | 说明 |
|---|---|
| HOG 特征 | 方向梯度直方图,提取图像边缘和纹理特征 |
| 线性分类器 | 对 HOG 特征进行分类判断 |
| 金字塔图像结构 | 多尺度检测不同大小的人脸 |
| 滑动窗口 | 在图像上滑动检测人脸 |
相比 OpenCV 的 Haar 级联分类器,dlib 的检测效果更准确,误检率更低。
二、dlib 环境搭建
2.1 版本要求
| 依赖 | 推荐版本 | 说明 |
|---|---|---|
| Python | 3.6 ~ 3.12 | dlib 针对不同 Python 版本有对应的安装包 |
| NumPy | 1.x(推荐 1.26) | NumPy 2.0 与部分 dlib 版本不兼容 |
| OpenCV | 4.x | 不要使用 OpenCV 5.0 以上版本 |
2.2 安装方式
方式一:使用 conda 安装(推荐)
bash
conda install -c conda-forge dlib
方式二:pip 在线安装
bash
pip install cmake
pip install dlib
注意:dlib 需要 CMake 和 C++ 编译环境,pip 直接安装可能失败。建议优先使用 conda。
方式三:离线安装(推荐 Windows 用户)
如果你的 Python 版本和系统不匹配在线安装,可以使用离线 whl 文件安装。以下是不同 Python 版本对应的 dlib 安装包:
| 文件名 | Python 版本 | 说明 |
|---|---|---|
dlib-19.19.0-cp36-cp36m-win_amd64.whl |
Python 3.6 | 适用于 3.6 版本 |
dlib-19.19.0-cp37-cp37m-win_amd64.whl |
Python 3.7 | 适用于 3.7 版本 |
dlib-19.19.0-cp38-cp38-win_amd64.whl |
Python 3.8 | 适用于 3.8 版本 |
dlib-19.22.1-cp39-cp39-win_amd64.whl |
Python 3.9 | 适用于 3.9 版本 |
dlib-19.22.99-cp310-cp310-win_amd64.whl |
Python 3.10 | 适用于 3.10 版本 |
dlib-19.24.1-cp311-cp311-win_amd64.whl |
Python 3.11 | 适用于 3.11 版本 |
dlib-19.24.2-cp312-cp312-win_amd64.whl |
Python 3.12 | 适用于 3.12 版本 |
离线安装步骤:
bash
# 先查看自己的 Python 版本
python --version
# 根据版本选择对应的 whl 文件,例如 Python 3.11
pip install dlib-19.24.1-cp311-cp311-win_amd64.whl
怎么看文件名 :
cp311表示 Python 3.11,win_amd64表示 Windows 64 位系统。选择与自己 Python 版本一致的 whl 文件即可。
2.3 验证安装
python
import dlib
print(dlib.__version__)
三、dlib 图片人脸检测
3.1 完整代码
python
import cv2
import dlib
import numpy as np
# get_frontal_face_detector() 生成人脸检测器
# 使用 HOG 算法、线性分类器、金字塔图像结构和滑动窗口检测等技术
# 比 OpenCV 提供的 Haar 级联分类器效果更好
detector = dlib.get_frontal_face_detector()
# 读取图片
img = cv2.imread("faces.png")
img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5)
# 参数:
# image:待检测的可能含有人脸的图像
# n:表示采用上采样的次数。上采样会让图像变大,能够检测到更多人脸对象,
# 提高小人脸的检测效果。通常建议将此参数设置为 0 或 1。
# 较大的值会增加检测的准确性,但会降低处理速度。
# 返回值 faces:返回检测图像中的所有人脸框
faces = detector(img, 0)
for face in faces:
# 获取人脸框的坐标
x1 = face.left()
y1 = face.top()
x2 = face.right()
y2 = face.bottom()
# 绘制人脸框
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.2 关键函数说明
| 函数 | 说明 |
|---|---|
dlib.get_frontal_face_detector() |
创建 HOG 人脸检测器 |
detector(img, 0) |
检测图像中的人脸,返回人脸框列表 |
face.left() |
人脸框左边界坐标 |
face.top() |
人脸框上边界坐标 |
face.right() |
人脸框右边界坐标 |
face.bottom() |
人脸框下边界坐标 |
四、dlib vs OpenCV 人脸检测对比
4.1 完整代码
python
import cv2
import dlib
# OpenCV Haar 级联分类器
face_cascade = cv2.CascadeClassifier(
cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
)
# dlib HOG 检测器
detector = dlib.get_frontal_face_detector()
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
ret, image = cap.read()
if not ret:
print("不能读取摄像头")
break
img = image.copy()
# ---------- OpenCV 检测 ----------
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces_cv = face_cascade.detectMultiScale(gray, 1.05, 9, minSize=(20, 20))
for (x, y, w, h) in faces_cv:
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow('opencv', image)
# ---------- dlib 检测 ----------
faces_dlib = detector(img, 0)
for face in faces_dlib:
x1 = face.left()
y1 = face.top()
x2 = face.right()
y2 = face.bottom()
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.imshow("dlib", img)
if cv2.waitKey(1) == 27:
break
cap.release()
cv2.destroyAllWindows()
4.2 两种检测器对比
| 对比维度 | OpenCV Haar | dlib HOG |
|---|---|---|
| 检测原理 | Haar 特征 + 级联分类器 | HOG 特征 + 线性分类器 |
| 检测效果 | 一般,误检较多 | 更准确,误检更少 |
| 检测速度 | 快 | 稍慢 |
| 侧脸检测 | 差 | 较好 |
| 小脸检测 | 一般 | 较好 |
| 鲁棒性 | 对光照敏感 | 对光照较鲁棒 |
| 适用场景 | 实时性要求高的场景 | 准确性要求高的场景 |
总结:dlib 的检测效果明显优于 OpenCV Haar,但速度略慢。实际项目中可根据需求选择。
五、总结
核心函数速查
| 函数 | 用途 |
|---|---|
dlib.get_frontal_face_detector() |
创建人脸检测器 |
detector(image, n) |
检测人脸,返回人脸框列表 |
face.left() / top() / right() / bottom() |
人脸框坐标 |
版本要求速查
| 依赖 | 推荐版本 |
|---|---|
| Python | 3.6 ~ 3.12 |
| NumPy | 1.x(推荐 1.26) |
| OpenCV | 4.x(不要 5.0 以上) |
| dlib | 19.19 ~ 19.24.2 |
注意事项
| 要点 | 说明 |
|---|---|
| NumPy 版本 | 使用 1.x,推荐 1.26,避免 2.0 的兼容性问题 |
| OpenCV 版本 | 不要使用 5.0 以上版本 |
| 安装方式 | 优先使用 conda 安装,或使用离线 whl 文件 |
| 上采样参数 | detector(img, 0) 中的 0 表示不上采样,检测速度快;设为 1 可提高小脸检测率 |
| 灰度图 | dlib 虽然可以直接处理彩色图,但转灰度图后检测速度更快 |
系列直达
- 上篇 :OpenCV学习:人脸识别
- 本篇:OpenCV学习:dlib 人脸检测(本文)
- 下篇 :OpenCV学习:dlib 人脸关键点检测