使用 OpenCV 和 Dlib实现轮廓绘制
文章目录
- 引言
- 1.准备工作
- 2.代码解析
- 2.1 导入必要的库
- 2.2 定义绘制直线函数
- 2.3 定义绘制凸包函数
- 2.4 加载图像和模型
- 2.5 关键点检测与绘制
- 2.6 显示结果
- 3.68个关键点索引说明
- 4.应用场景
- 5.优化建议
- 6. 结语
引言
人脸关键点检测是计算机视觉中的重要任务,广泛应用于人脸识别、表情分析、虚拟化妆等领域。本文将介绍如何使用Python中的Dlib库和OpenCV实现人脸68个关键点的检测,并绘制面部轮廓特征。
1.准备工作
首先需要安装必要的库:
pip install opencv-python numpy dlib
此外,还需要下载Dlib的预训练模型文件:
- shape_predictor_68_face_landmarks.dat
2.代码解析
2.1 导入必要的库
import numpy as np
import dlib
import cv2
2.2 定义绘制直线函数
def drawLine(start, end):"""连接指定范围内的关键点"""pts = shape[start:end]for l in range(1, len(pts)):ptA = tuple(pts[l - 1])ptB = tuple(pts[l])cv2.line(image, ptA, ptB, (0, 255, 0), 2)
这个函数用于连接一系列关键点,形成连续的线条,常用于绘制眉毛、下巴等轮廓。
- pts:从shape变量中切片获取从start到end索引之间的所有点,存储在pts中
- ptA是前一个点(当前点减1)
- ptB是当前点
- 将它们转换为元组形式(OpenCV的 line 函数需要坐标以元组形式传递
2.3 定义绘制凸包函数
def drawConvexHull(start, end):"""绘制指定范围内关键点的凸包"""Facial = shape[start:end+1]mouthHull = cv2.convexHull(Facial)cv2.drawContours(image, [mouthHull], -1, (0, 255, 0), 2)
凸包函数特别适合用于眼睛和嘴巴的轮廓绘制,因为它可以自动计算并连接最外围的点,形成闭合区域。
- Facial 存储从 start 到 end 的所有点(注意:end+1 是因为 Python 切片是左闭右开的)。
- cv2.convexHull(Facial) 是 OpenCV 提供的凸包计算函数
2.4 加载图像和模型
image = cv2.imread('face.png')
detector = dlib.get_frontal_face_detector()
faces = detector(image, 0)
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
2.5 关键点检测与绘制
for face in faces:shape = predictor(image, face)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) # 鼻子
2.6 显示结果
cv2.imshow('Frame', image)
cv2.waitKey()
cv2.destroyAllWindows()
结果显示如下:
3.68个关键点索引说明
Dlib的68点人脸关键点模型按照以下顺序排列:
- 0-16: 下巴轮廓
- 17-21: 左眉毛
- 22-26: 右眉毛
- 27-35: 鼻梁和鼻尖
- 36-41: 左眼
- 42-47: 右眼
- 48-59: 外嘴唇
- 60-67: 内嘴唇
4.应用场景
- 人脸特征分析:通过关键点可以分析表情、年龄等特征
- 虚拟化妆:在关键点确定的区域应用虚拟化妆效果
- 人脸识别:作为人脸识别的预处理步骤
- AR应用:在关键点上叠加虚拟物体
5.优化建议
- 对于视频流处理,可以考虑使用更高效的检测算法
- 添加异常处理,防止没有检测到人脸时程序崩溃
- 可以添加参数调节功能,如线条颜色、粗细等
6. 结语
本文介绍了使用 Dlib 和 OpenCV 实现轮廓绘制的基本方法。通过简单的代码,我们就可以实现专业级的人脸特征分析功能。这为更复杂的人脸相关应用开发奠定了基础。
于高山之巅,方见大河奔涌;于山峰之上, 方觉长风浩荡。前进的道路总是会出现各种曲折,希望大家能不断地努力前行,一起加油! 🚀🚀🚀