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

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

相关推荐
yuanjun041638 分钟前
RTDETRv2 pytorch训练
人工智能·pytorch·python
杰克逊的日记42 分钟前
什么是PyTorch
人工智能·pytorch·python
归去_来兮2 小时前
LightGBM算法原理及Python实现
人工智能·机器学习·集成学习·lightgbm
Blossom.1183 小时前
脑机接口技术:开启人类与机器的全新交互时代
人工智能·驱动开发·深度学习·计算机视觉·aigc·硬件架构·交互
ProgramHan3 小时前
什么是自然语言处理(NLP)?如何使用NLP进行情感分析?
人工智能·自然语言处理
小白白搭建3 小时前
wordperss AI插件:AI图文+视频+长尾关键词自动生成,已内置deepseek、kimi全模型,支持简单一键接入更多自定义API
人工智能·wordpress·ai插件·deepseek·wordprerss插件·wordpress ai插件
giszz3 小时前
【Web3】上市公司利用RWA模式融资和促进业务发展案例
人工智能·web3·区块链
pen-ai4 小时前
【NLP】 26. 语言模型原理与概率建模方法详解(Language Models)
人工智能·语言模型·自然语言处理
pen-ai4 小时前
【NLP】30. 深入理解 In-Context Learning 的核心机制与策略
人工智能·自然语言处理