文章目录
- 一、人脸面部轮廓绘制代码实现
- 1、定义绘制直线段的函数
- 2、定义绘制凸包轮廓的函数
- 3、读取输入图像
- 4、初始化dlib的人脸检测器
- 5、使用检测器在图像中检测人脸(参数0表示不进行图像缩放)
- 6、加载dlib的68点人脸关键点预测模型
- 7、遍历检测到的每个人脸
- 8、显示处理后的图像
- 总结
一、人脸面部轮廓绘制代码实现
import numpy as np
import dlib
import cv2
1、定义绘制直线段的函数
def drawLine(start, end):
# 从形状数组中获取起点到终点的所有点
pts = shape[start:end]
# 遍历这些点,依次连接相邻点
for l in range(1, len(pts)):
# 获取前一个点
ptsA = tuple(pts[l-1])
# 获取当前点
ptsB = tuple(pts[l])
# 在图像上绘制连接这两个点的绿色线段
cv2.line(image, ptsA, ptsB, (0, 245, 0), 2)
2、定义绘制凸包轮廓的函数
def drawConvexHull(start, end):
# 从形状数组中获取指定范围内的点
Facial = shape[start:end+1]
# 计算这些点的凸包(最小凸多边形)
mouthHull = cv2.convexHull(Facial) # 凸包函数
# 在图像上绘制凸包轮廓(绿色)
cv2.drawContours(image, [mouthHull], -1, (0, 255, 0), 2)
3、读取输入图像
image = cv2.imread('../data/man.png')
4、初始化dlib的人脸检测器
detector = dlib.get_frontal_face_detector()
5、使用检测器在图像中检测人脸(参数0表示不进行图像缩放)
faces = detector(image, 0)
6、加载dlib的68点人脸关键点预测模型
predictor = dlib.shape_predictor('../data/shape_predictor_68_face_landmarks.dat')
7、遍历检测到的每个人脸
for face in faces:
# 对当前人脸进行关键点预测
shape = predictor(image, face)
# 将关键点转换为numpy数组格式 [[x1, y1], [x2, y2], ...]
shape = np.array([[p.x, p.y] for p in shape.parts()])
# 绘制右眼凸包(关键点36-42)
drawConvexHull(36, 42)
# 绘制左眼凸包(关键点42-47)
drawConvexHull(42, 47)
# 绘制上嘴唇凸包(关键点48-59)
drawConvexHull(48, 59)
# 绘制下嘴唇凸包(关键点60-67)
drawConvexHull(60, 67)
# 绘制下巴轮廓(关键点0-17)
drawLine(0, 17)
# 绘制右眉毛轮廓(关键点17-22)
drawLine(17, 22)
# 绘制左眉毛轮廓(关键点22-27)
drawLine(22, 27)
# 绘制鼻梁轮廓(关键点27-36)
drawLine(27, 36)
8、显示处理后的图像
cv2.imshow('image', image)
# 等待用户按键
cv2.waitKey(0)
# 关闭所有OpenCV窗口
cv2.destroyAllWindows()
效果展示
代码中使用的关键点索引对应人脸的不同部位:
眼睛区域:
36-42:右眼轮廓(从右眼角开始顺时针)
42-47:左眼轮廓(从左眼角开始顺时针)
嘴唇区域:
48-59:上嘴唇轮廓
60-67:下嘴唇轮廓
面部轮廓:
0-16:下巴和脸颊轮廓(代码中绘制0-17,包含17个点)
17-21:右眉毛
22-26:左眉毛
27-35:鼻子(代码中绘制27-36)
函数功能说明
drawLine(start, end) 函数:
功能:连接一系列关键点形成直线段
参数:起始索引和结束索引
实现:获取索引范围内的点,依次连接相邻点
drawConvexHull(start, end) 函数:
功能:计算并绘制关键点的凸包轮廓
参数:起始索引和结束索引
实现:计算最小凸多边形并绘制轮廓
优势:比简单连线更平滑,能更好捕捉曲线特征
总结
这种组合方法(凸包+直线连接)在保持效率的同时,能够准确描绘人脸的主要特征轮廓,适用于人脸分析、AR滤镜等应用场景。