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 安装(推荐)
condainstall-cconda-forge dlib方式二:离线安装(推荐 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 版本 |
离线安装步骤:
# 先查看自己的 Python 版本python--version# 根据版本选择对应的 whl 文件,例如 Python 3.11pipinstalldlib-19.24.1-cp311-cp311-win_amd64.whl怎么看文件名:
cp311表示 Python 3.11,win_amd64表示 Windows 64 位系统。选择与自己 Python 版本一致的 whl 文件即可。
2.3 验证安装
importdlibprint(dlib.__version__)三、dlib 图片人脸检测
3.1 完整代码
importcv2importdlibimportnumpyasnp# 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)forfaceinfaces:# 获取人脸框的坐标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 完整代码
importcv2importdlib# 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)ifnotcap.isOpened():print("Cannot open camera")exit()whileTrue:ret,image=cap.read()ifnotret:print("不能读取摄像头")breakimg=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)infaces_cv:cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)cv2.imshow('opencv',image)# ---------- dlib 检测 ----------faces_dlib=detector(img,0)forfaceinfaces_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)ifcv2.waitKey(1)==27:breakcap.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 人脸关键点检测