使用 OpenCV 和 Dlib实现轮廓绘制

文章目录

  • 引言
  • 1.准备工作
  • 2.代码解析
    • [2.1 导入必要的库](#2.1 导入必要的库)
    • [2.2 定义绘制直线函数](#2.2 定义绘制直线函数)
    • [2.3 定义绘制凸包函数](#2.3 定义绘制凸包函数)
    • [2.4 加载图像和模型](#2.4 加载图像和模型)
    • [2.5 关键点检测与绘制](#2.5 关键点检测与绘制)
    • [2.6 显示结果](#2.6 显示结果)
  • 3.68个关键点索引说明
  • 4.应用场景
  • 5.优化建议
  • [6. 结语](#6. 结语)

引言

人脸关键点检测是计算机视觉中的重要任务,广泛应用于人脸识别、表情分析、虚拟化妆等领域。本文将介绍如何使用Python中的Dlib库和OpenCV实现人脸68个关键点的检测,并绘制面部轮廓特征。

1.准备工作

首先需要安装必要的库:

bash 复制代码
pip install opencv-python numpy dlib

此外,还需要下载Dlib的预训练模型文件:

2.代码解析

2.1 导入必要的库

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

2.2 定义绘制直线函数

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

python 复制代码
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 加载图像和模型

python 复制代码
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 关键点检测与绘制

python 复制代码
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 显示结果

python 复制代码
cv2.imshow('Frame', image)
cv2.waitKey()
cv2.destroyAllWindows()

结果显示如下:

3.68个关键点索引说明

Dlib的68点人脸关键点模型按照以下顺序排列:

  1. 0-16: 下巴轮廓
  2. 17-21: 左眉毛
  3. 22-26: 右眉毛
  4. 27-35: 鼻梁和鼻尖
  5. 36-41: 左眼
  6. 42-47: 右眼
  7. 48-59: 外嘴唇
  8. 60-67: 内嘴唇

4.应用场景

  1. 人脸特征分析:通过关键点可以分析表情、年龄等特征
  2. 虚拟化妆:在关键点确定的区域应用虚拟化妆效果
  3. 人脸识别:作为人脸识别的预处理步骤
  4. AR应用:在关键点上叠加虚拟物体

5.优化建议

  1. 对于视频流处理,可以考虑使用更高效的检测算法
  2. 添加异常处理,防止没有检测到人脸时程序崩溃
  3. 可以添加参数调节功能,如线条颜色、粗细等

6. 结语

本文介绍了使用 DlibOpenCV 实现轮廓绘制的基本方法。通过简单的代码,我们就可以实现专业级的人脸特征分析功能。这为更复杂的人脸相关应用开发奠定了基础。

于高山之巅,方见大河奔涌;于山峰之上, 方觉长风浩荡。前进的道路总是会出现各种曲折,希望大家能不断地努力前行,一起加油! 🚀🚀🚀

相关推荐
AI医影跨模态组学3 分钟前
Cell Rep Med 复旦大学附属肿瘤医院邵志敏教授、肖毅等团队:基于机器学习的多模态整合促进HR+/HER2−乳腺癌的风险分层
人工智能·机器学习·论文·医学·医学影像
锵锵锵锵~蒋12 分钟前
AI全托管处理EXCEL(并接入AI平台)
人工智能·excel·mcp·ai全托管·ai提效’
Flandern111113 分钟前
Go程序员学习AI大模型项目实战02:给 AI 装上“大脑”:从配置解包到流式生成的深度拆解
人工智能·后端·python·学习·golang
weixin_5134499626 分钟前
walk_these_ways项目学习记录第十篇(通过行为多样性 (MoB) 实现地形泛化)--从仿真到部署
人工智能·学习·算法
2501_9481142428 分钟前
Claude Sonnet 4.6 深度评测:性能逼近 Opus、成本打骨折,附接入方案与选型指南
大数据·网络·人工智能·安全·架构
angleboy832 分钟前
【原创】如何WIN 10/11系统下解决YOLOv13训练异常的安装指南
人工智能·深度学习·yolo
kobesdu34 分钟前
ROS导航调参指南:机器人模型、TEB/DWA与Costmap全解析
人工智能·机器人·ros
沫儿笙34 分钟前
库卡焊接机器人混合气节气装置
人工智能·机器人
ZhuNian的学习乐园40 分钟前
LLM智能体调度:从ReAct到多智能体调度
人工智能·python·深度学习
沫儿笙40 分钟前
弧焊机器人节气装置
人工智能·机器人