OpenCv高阶(二十)——dlib脸部轮廓绘制

文章目录


一、人脸面部轮廓绘制代码实现

python 复制代码
import numpy as np
import dlib
import cv2

1、定义绘制直线段的函数

python 复制代码
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、定义绘制凸包轮廓的函数

python 复制代码
def drawConvexHull(start, end):
    # 从形状数组中获取指定范围内的点
    Facial = shape[start:end+1]
    # 计算这些点的凸包(最小凸多边形)
    mouthHull = cv2.convexHull(Facial)   # 凸包函数
    # 在图像上绘制凸包轮廓(绿色)
    cv2.drawContours(image, [mouthHull], -1, (0, 255, 0), 2)

3、读取输入图像

python 复制代码
image = cv2.imread('../data/man.png')

4、初始化dlib的人脸检测器

python 复制代码
detector = dlib.get_frontal_face_detector()

5、使用检测器在图像中检测人脸(参数0表示不进行图像缩放)

python 复制代码
faces = detector(image, 0)

6、加载dlib的68点人脸关键点预测模型

python 复制代码
predictor = dlib.shape_predictor('../data/shape_predictor_68_face_landmarks.dat')

7、遍历检测到的每个人脸

python 复制代码
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、显示处理后的图像

python 复制代码
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滤镜等应用场景。

相关推荐
DX_水位流量监测6 小时前
大坝安全监测之渗流渗压位移监测设备技术解析
大数据·运维·服务器·网络·人工智能·安全
昵称已被吞噬~‘(*@﹏@*)’~6 小时前
【RL+空战】学习记录03:基于JSBSim构造简易空空导弹模型,并结合python接口调用测试
开发语言·人工智能·python·学习·深度强化学习·jsbsim·空战
Yeats_Liao7 小时前
MindSpore开发之路(二十四):MindSpore Hub:快速复用预训练模型
人工智能·分布式·神经网络·机器学习·个人开发
老周聊架构7 小时前
基于YOLOv8-OBB旋转目标检测数据集与模型训练
人工智能·yolo·目标检测
AKAMAI7 小时前
基准测试:Akamai云上的NVIDIA RTX Pro 6000 Blackwell
人工智能·云计算·测试
寂寞恋上夜7 小时前
异步任务怎么设计:轮询/WebSocket/回调(附PRD写法)
网络·人工智能·websocket·网络协议·markdown转xmind·deepseek思维导图
Deepoch7 小时前
赋能未来:Deepoc具身模型开发板如何成为机器人创新的“基石”
人工智能·机器人·开发板·具身模型·deepoc
格林威7 小时前
传送带上运动模糊图像复原:提升动态成像清晰度的 6 个核心方案,附 OpenCV+Halcon 实战代码!
人工智能·opencv·机器学习·计算机视觉·ai·halcon·工业相机
且去填词8 小时前
DeepSeek API 深度解析:从流式输出、Function Calling 到构建拥有“手脚”的 AI 应用
人工智能·python·语言模型·llm·agent·deepseek