文章目录
- 完整代码一览
- [安装 dlib 与下载模型](#安装 dlib 与下载模型)
-
- [安装 dlib](#安装 dlib)
- [下载 68 点关键点模型](#下载 68 点关键点模型)
- 导入库
- 读取图像
- 创建人脸检测器
- 执行人脸检测
- 加载关键点预测器
- 遍历每个人脸并提取关键点
- 绘制关键点并标注序号
- 显示结果
- [68 个关键点的编号与分布](#68 个关键点的编号与分布)
完整代码一览
c
import numpy as np
import cv2
import dlib
img = cv2.imread('pyy.png')
detector = dlib.get_frontal_face_detector()
faces = detector(img, 0)
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
for face in faces:
shape = predictor(img, face)
landmark = np.array([[p.x, p.y] for p in shape.parts()])
for idx, point in enumerate(landmark):
pos = [point[0], point[1]]
cv2.circle(img, pos, 2, (0, 255, 0), 1)
cv2.putText(img, str(idx), pos, cv2.FONT_HERSHEY_SIMPLEX, 0.4, (255, 255, 255), 1, cv2.LINE_AA)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
安装 dlib 与下载模型
安装 dlib
dlib各版本下载地址:
进入下载文件的存放位置,比如D:\Edge\,在搜索栏输入cmd,输入命令:pip install dlib-19.6.0-cp36-cp36m-win_amd64.whl,下载完成。
cp36是python3.6版本的,cp35是python3.5版本的。
下载完成后调用运行命令: pip install dlib==19.6.1
下载 68 点关键点模型
代码需要加载 shape_predictor_68_face_landmarks.dat,这是 dlib 官方预训练好的模型。下载地址:
下载后解压,将 .dat 文件放在与 Python 脚本相同的文件夹中。
导入库
c
import numpy as np
import cv2
import dlib #提供人脸检测和关键点预测功能
读取图像
c
img = cv2.imread('pyy.png')
创建人脸检测器
c
detector = dlib.get_frontal_face_detector()
该函数返回一个基于 HOG(方向梯度直方图)和线性 SVM 的人脸检测器,它对正面和侧面人脸都有较好的检测效果,且速度较快。
执行人脸检测
c
faces = detector(img, 0)
detector(img, 0) 对图像进行人脸检测。第二个参数 0 表示不进行图像上采样(upsample),即使用原始尺寸进行检测。如果你想检测更小的人脸,可以增加这个值(如 1 表示上采样一次),但会降低速度。
加载关键点预测器
c
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
加载预训练模型,能够输出稳定、精准的 68 个关键点坐标。
遍历每个人脸并提取关键点
c
for face in faces:
shape = predictor(img, face)
landmark = np.array([[p.x, p.y] for p in shape.parts()])
对于每个人脸,调用 predictor(img, face) 得到 shape 对象,它包含 parts() 方法,返回一个包含 68 个点的列表。
列表推导式 p.x, p.y for p in shape.parts() 将每个点转换为 (x, y) 元组,再转换成 NumPy 数组,便于后续遍历。
绘制关键点并标注序号
c
for idx, point in enumerate(landmark):
pos = [point[0], point[1]]
cv2.circle(img, pos, 2, (0, 255, 0), 1)
cv2.putText(img, str(idx), pos, cv2.FONT_HERSHEY_SIMPLEX, 0.4, (255, 255, 255), 1, cv2.LINE_AA)
enumerate 遍历每个点,idx 是索引(0~67),point 是坐标数组。
cv2.circle 在点位置画一个绿色小圆点((0,255,0)),半径 2,线宽 1。
cv2.putText 在点旁边显示索引数字,字体大小 0.4,白色,抗锯齿渲染。
显示结果
c
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
显示标注后的图像,按任意键关闭窗口。
运行结果:

68 个关键点的编号与分布
了解每个编号对应的部位,能帮你更好地利用这些点:
编号 部位描述
0 ~ 16 下巴轮廓(从右到左环绕)
17 ~ 21 左眼眉毛
22 ~ 26 右眼眉毛
27 ~ 30 鼻梁(从眉心到鼻尖)
31 ~ 35 鼻翼和鼻孔
36 ~ 41 左眼(6 个点)
42 ~ 47 右眼(6 个点)
48 ~ 59 外嘴唇轮廓
60 ~ 67 内嘴唇(嘴巴张开时可见)
你可以根据这些编号提取特定部位,例如计算眼睛的宽高比(EAR)来判断眨眼,或计算嘴巴的张开程度。
后续可以通过计算眼睛的宽高比,对人脸进行疲劳检测。