目录
一、项目介绍
二、环境安装
三、完整可运行代码
四、代码核心模块详解
1. drawline 连续连线函数
2. drawConvexHull 凸包绘制函数
3. dlib 68 关键点分区对照表(代码用到部分)
五、运行常见报错解决
报错 1:找不到 shape_predictor_68_face_landmarks.dat
报错 2:图片读取为空 (image=None)
报错 3:dlib 安装失败
六、拓展优化方向
七、效果说明
一、项目介绍
本文使用dlib68 个人脸特征点检测器 + OpenCV 实现人脸关键点可视化:
- 绘制脸部外轮廓、左右眉毛、鼻梁轮廓连线
- 对左右眼睛、外嘴唇、内嘴唇求取凸包并绘制闭合轮廓
- 依赖:numpy、dlib、opencv-python,需提前下载 68 点特征预测模型文件
二、环境安装
pip install numpy dlib opencv-python注意:dlib 安装失败可先安装 cmake、vs 编译工具; 模型文件下载:
shape_predictor_68_face_landmarks.dat,解压后和代码放同一目录
三、完整可运行代码
import numpy as np import dlib import cv2 def drawline(start, end): """ 绘制连续关键点连线 :param start: 起始关键点索引 :param end: 结束关键点索引 """ # 截取对应区间关键点 pts = shape[start:end] # 依次连接相邻点 for l in range(1, len(pts)): ptA = tuple(pts[l - 1]) ptB = tuple(pts[l]) # 绿色线条,线宽2 cv2.line(image, ptA, ptB, (0, 255, 0), 2) def drawConvexHull(start, end): """ 对指定区间关键点绘制凸包闭合轮廓(眼/嘴使用) :param start: 起始关键点索引 :param end: 结束关键点索引 """ # 截取五官关键点 Facial = shape[start:end + 1] # 计算凸包 mouthHull = cv2.convexHull(Facial) # 绘制凸包轮廓,-1表示填充所有轮廓 cv2.drawContours(image, [mouthHull], -1, (0, 255, 0), 2) # 1. 读取图片 image = cv2.imread("zjj1.jpg") # 2. 初始化dlib人脸检测器 detector = dlib.get_frontal_face_detector() # 第二个参数0代表不做图像上采样,速度更快;设1精度更高速度慢 faces = detector(image, 0) # 3. 加载68点关键点预测器 predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") # 遍历检测到的所有人脸 for face in faces: # 获取当前人脸68个关键点 shape = predictor(image, face) # 将dlib关键点对象转为numpy数组 [[x1,y1],[x2,y2]...] shape = np.array([[p.x, p.y] for p in shape.parts()]) # ========== 绘制五官凸包 ========== drawConvexHull(36, 41) # 左眼凸包 drawConvexHull(42, 47) # 右眼凸包 drawConvexHull(48, 59) # 外嘴唇凸包 drawConvexHull(60, 67) # 内嘴唇凸包 # ========== 绘制人脸连续轮廓线 ========== drawline(0, 17) # 下颌轮廓(下巴+脸颊下半部分) drawline(17, 22) # 右眉毛 drawline(22, 27) # 左眉毛 drawline(27, 36) # 鼻梁+鼻底轮廓 # 窗口展示结果 cv2.imshow('frame', image) # 等待任意按键退出 cv2.waitKey() # 销毁所有窗口 cv2.destroyAllWindows()四、代码核心模块详解
1. drawline 连续连线函数
功能:把一段连续的 68 点依次用直线连接,用于脸部、眉毛、鼻梁这类长条连续区域。 逻辑:
- 切片取出
start~end所有关键点 - 循环相邻两个点,调用
cv2.line绘制绿色线段
2. drawConvexHull 凸包绘制函数
眼睛、嘴唇是闭合环形区域,单纯连线会有凹陷,使用凸包包裹整个五官区域:
cv2.convexHull计算点集最小凸多边形cv2.drawContours画出闭合凸包轮廓
3. dlib 68 关键点分区对照表(代码用到部分)
表格
| 索引区间 | 对应部位 | 绘制方式 |
|---|---|---|
| 0~17 | 下颌脸颊 | 直线连线 |
| 17~22 | 右眉 | 直线连线 |
| 22~27 | 左眉 | 直线连线 |
| 27~36 | 鼻子轮廓 | 直线连线 |
| 36~41 | 左眼 | 凸包 |
| 42~47 | 右眼 | 凸包 |
| 48~59 | 外唇 | 凸包 |
| 60~67 | 内唇 | 凸包 |
五、运行常见报错解决
报错 1:找不到 shape_predictor_68_face_landmarks.dat
解决:
- 下载官方 68 点模型;
- 将 dat 文件和
.py代码放在同一个文件夹; - 或传入绝对路径,如
predictor = dlib.shape_predictor("C:/xxx/shape_predictor_68_face_landmarks.dat")
报错 2:图片读取为空 (image=None)
- 图片文件名写错,区分大小写;
- 图片和代码不在同一目录,使用绝对路径读取;
- 图片损坏,更换 jpg/png 图片测试
报错 3:dlib 安装失败
Windows:先安装 VS2019/2022 C++ 开发组件、cmake
pip install cmake pip install dlib六、拓展优化方向
- 更换线条颜色、粗细,区分五官(眼睛蓝色、嘴唇红色)
- 循环遍历摄像头实时人脸关键点检测(cv2.VideoCapture)
- 提取眼 / 嘴关键点坐标,做疲劳检测、表情识别
- 增加关键点圆点绘制,直观看到 68 个点位
七、效果说明
运行后弹出窗口,人脸区域会用绿色线条画出脸部、眉毛、鼻梁,双眼、嘴唇会自动生成闭合凸包轮廓,完整勾勒人脸五官结构。