OpenCv高阶(十九)——dlib关键点定位

news2025/6/5 4:52:55

文章目录

  • 一、什么是人脸关键点定位?
  • 二、关键点模型的下载及关键信息的理解
  • 三、dlib关键点定位的简单实现
    • (1)导入必要的库
    • (2)从指定路径读取图像文件
    • (3)创建dlib的正面人脸检测器对象
    • (4)使用检测器在图像上检测人脸
    • (5)加载dlib预训练的人脸关键点定位模型
    • (6)遍历检测到的每个人脸区域
    • (7)显示处理后的图像(包含人脸关键点标记)
  • 四、人脸关键点定位的主要作用和应用
  • 五、主要技术方法
  • 总结


一、什么是人脸关键点定位?

人脸关键点定位(Facial Landmark Detection),也称为人脸特征点检测或人脸对齐,是计算机视觉领域的一项基础任务。它的核心目标是在一张包含人脸的图像中,自动地、精确地定位出人脸上一系列预定义的关键解剖点的位置坐标(通常是二维像素坐标)。
在这里插入图片描述

二、关键点模型的下载及关键信息的理解

关键点模型下载:
官网下载:http://dlib.net/files/
在这里插入图片描述

关键点: 这些点是经过精心选择的,代表了人脸的重要结构和特征。常见的点包括:

眉毛的轮廓点(例如,左右眉峰、眉梢)

眼睛的轮廓点(例如,眼角、眼睑)

鼻子的轮廓点(例如,鼻尖、鼻翼)

嘴巴的轮廓点(例如,嘴角、唇峰、唇谷)

脸部的轮廓点(例如,下巴尖、脸颊边缘)

有时还包括瞳孔中心、脸颊点等。

定位: 算法需要输出每个关键点的精确坐标 (x, y),这些坐标对应于它们在输入图像中的像素位置。

预定义模型: 关键点的数量和位置通常是预先定义好的标准模型。最常见的模型有:

68点模型: 这是最经典和广泛使用的模型,包括眉毛(每边5点)、眼睛(每边6点)、鼻子(9点)、嘴巴(20点)和脸部轮廓(17点)。

5点模型: 更简单,通常定位两个眼睛中心、鼻尖和两个嘴角。常用于快速粗略对齐。

106点模型 / 稠密关键点模型: 包含更多点(如脸颊、额头),能更精细地描述人脸形状,常用于高级特效和3D重建。

三、dlib关键点定位的简单实现

(1)导入必要的库

import cv2  # OpenCV库,用于图像处理和计算机视觉任务
import numpy as np  # NumPy库,用于数值计算和数组操作
import dlib  # dlib库,提供强大的机器学习工具,特别擅长人脸检测和特征点定位

(2)从指定路径读取图像文件

img = cv2.imread('../data/man.png')

(3)创建dlib的正面人脸检测器对象

# get_frontal_face_detector()使用HOG特征+SVM分类器检测人脸
detector = dlib.get_frontal_face_detector()

(4)使用检测器在图像上检测人脸

# 参数0表示不进行上采样(原始图像大小检测)
# 返回值faces是一个包含所有检测到的人脸区域的矩形对象列表
faces = detector(img, 0)

(5)加载dlib预训练的人脸关键点定位模型

# 该模型可以定位人脸上的68个关键点(shape_predictor_68_face_landmarks.dat)
predictor = dlib.shape_predictor("../data/shape_predictor_68_face_landmarks.dat")

(6)遍历检测到的每个人脸区域

for face in faces:
    # 使用关键点定位模型预测当前人脸的68个关键点
    # shape是一个包含68个关键点坐标的对象
    shape = predictor(img, face)
    
    # 将关键点转换为NumPy数组格式,便于处理
    # 每个关键点表示为[x, y]坐标
    landmarks = np.array([[p.x, p.y] for p in shape.parts()])
    
    # 遍历所有68个关键点及其索引
    for idx, point in enumerate(landmarks):
        # 获取当前关键点的坐标
        pos = [point[0], point[1]]
        
        # 在图像上绘制关键点(绿色实心圆)
        # 参数说明:
        #   img: 目标图像
        #   pos: 圆心坐标
        #   2: 圆的半径(像素)
        #   (0,255,0): 颜色(BGR格式,绿色)
        #   thickness=-1: 实心圆
        cv2.circle(img, pos, 2, color=(0, 255, 0), thickness=-1)
        
        # 在关键点旁边绘制其索引编号(白色文本)
        # 参数说明:
        #   img: 目标图像
        #   str(idx): 要绘制的文本(当前点的索引)
        #   pos: 文本左下角位置
        #   cv2.FONT_HERSHEY_SIMPLEX: 字体类型
        #   0.45: 字体缩放比例
        #   (255,255,255): 文本颜色(白色)
        #   1: 文本线宽
        #   cv2.LINE_AA: 抗锯齿线型
        cv2.putText(img, str(idx), pos, cv2.FONT_HERSHEY_SIMPLEX, 
                   0.45, (255, 255, 255), 1, cv2.LINE_AA)

(7)显示处理后的图像(包含人脸关键点标记)

cv2.imshow('img', img)

# 等待键盘输入(0表示无限等待)
cv2.waitKey(0)

#)销毁所有OpenCV创建的窗口
cv2.destroyAllWindows()

效果展示
在这里插入图片描述
同样此处依然可以引入摄像头,实时对人脸进行关键点定位。

四、人脸关键点定位的主要作用和应用

人脸对齐: 这是最基础也是最重要的应用。通过定位关键点,可以将不同姿态、尺度、位置的人脸图像“矫正”到一个标准姿态(通常是正面朝前),极大地提高后续人脸识别、表情识别等任务的准确性和鲁棒性。

人脸识别/验证: 对齐后的人脸特征更容易进行比较和匹配。

表情识别: 关键点位置的变化(如嘴角上扬、眉毛皱起)是分析面部表情的关键线索。

人脸姿态估计: 根据关键点的分布和相对位置,可以估计人脸在三维空间中的朝向(偏航角、俯仰角、翻滚角)。

人脸美化/美颜: 瘦脸、大眼、美妆等滤镜效果需要精确知道眼睛、嘴巴、脸型的位置才能精准施加效果。

虚拟化妆/试妆: 在嘴唇、眼睑等部位叠加虚拟妆容需要精确定位。

增强现实: 在脸上叠加虚拟面具、眼镜、贴纸或特效(如动物鼻子、胡子)需要关键点作为锚点。

人机交互: 通过跟踪关键点的运动(如眨眼、张嘴)实现非接触式控制。

3D人脸重建: 稠密的关键点是构建高精度3D人脸模型的重要输入。

医学分析: 辅助分析某些面部特征或表情(如某些疾病的早期面部表征)。

疲劳驾驶检测: 通过检测眼睛开合程度、打哈欠(嘴部动作)等关键点状态判断驾驶员状态。

动画与游戏: 驱动虚拟角色的面部表情。

五、主要技术方法

传统方法:

主动形状模型: 通过迭代调整一个初始的平均人脸形状模型来拟合图像特征。

主动外观模型: 在ASM基础上,不仅考虑形状,还考虑纹理(外观)信息。

约束局部模型: 为每个关键点训练独立的局部检测器,并利用形状约束来优化整体结果。

深度学习方法 (主流):

使用卷积神经网络直接学习从输入图像到关键点坐标的映射,通常视为一个回归问题。

常见网络架构:各种定制的CNN、Hourglass网络、HRNet等。

通常输出一个包含所有关键点坐标的向量,或者一个关键点位置的热力图。

训练需要大量标注好关键点位置的人脸图像数据集。

总结

人脸关键点定位是让计算机“看懂”人脸结构的基础技术。它通过精确定位一系列预定义的面部特征点,为众多上层应用(人脸识别、表情分析、美颜滤镜、AR特效等)提供了至关重要的几何结构信息。虽然深度学习方法极大地提升了定位的精度和鲁棒性,但在处理极端姿态、严重遮挡和复杂光照等场景时仍存在挑战,是计算机视觉领域持续研究的重要方向。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2397014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BUUCTF之[ACTF2020 新生赛]BackupFile

打开环境就一句话 找出源文件! 结合题目名字&#xff1a;BackupFile 先用dirsearct扫描网站文件 发现一个index.php.bak ,拼接url下载 打开发现php代码 <?php include_once "flag.php";if(isset($_GET[key])) {$key $_GET[key];if(!is_numeric($key)) {exit…

头歌之动手学人工智能-Pytorch 之autograd

目录 第1关&#xff1a;Variable 任务描述 编程要求 测试说明 没有伟大的愿望&#xff0c;就没有伟大的天才。——巴尔扎克开始你的任务吧&#xff0c;祝你成功&#xff01; 第2关&#xff1a;Variable 属性 任务描述 编程要求 测试说明 真正的科学家应当是个幻想家&a…

Kafka集成Flume/Spark/Flink(大数据)/SpringBoot

Kafka集成Flume Flume生产者 ③、安装Flume&#xff0c;上传apache-flume的压缩包.tar.gz到Linux系统的software&#xff0c;并解压到/opt/module目录下&#xff0c;并修改其名称为flume Flume消费者 Kafka集成Spark 生产者 object SparkKafkaProducer{def main(args:Array[S…

Scratch节日 | 拯救屈原 | 端午节

端午节快乐&#xff01; 这款特别为端午节打造的Scratch游戏 《拯救屈原》&#xff0c;将带你走进古代中国&#xff0c;感受历史与文化的魅力&#xff01; &#x1f3ee; 游戏介绍 扮演勇敢的探险者&#xff0c;穿越时空回到古代&#xff0c;解锁谜题&#xff0c;完成任务&…

rabbitmq Direct交换机简介

在实际开发中&#xff0c;需求可能变得复杂&#xff0c;如消息的收发和处理。以支付系统为例&#xff0c;成功支付后需要改变订单状态并通知用户&#xff0c;而失败则不需要。为处理这种情况&#xff0c;提出了使用Direct交换机&#xff0c;它可以根据规则将消息路由到指定队列…

Git实战--基于已有分支克隆进行项目开发的完整流程

Git克隆项目开发流程 ✅ 一、完整流程概述✅ 二、详细操作步骤Step 1&#xff1a;克隆仓库&#xff08;如果尚未克隆&#xff09;Step 2&#xff1a;获取远程分支信息并切换到 feature/ 获取所有远程分支Step 3&#xff1a;创建并切换到你的新分支Step 4&#xff1a;开始开发新…

2_MCU开发环境搭建-配置MDK兼容Keil4和C51

MCU开发环境搭建-配置MDK兼容Keil4和C51 一、概述 本文以MDK-ARM V5.36版本基础介绍DMK-ARM工程兼容Keil4和C51的配置。 注:在阅读本文前,请先安装和配置完成MDK-ARM(Keil5)。 二、工具包下载 链接: https://pan.baidu.com/s/1Tu2tDD6zRra4xb_PuA1Wsw 提取码: 81pp 三、…

通过远程桌面连接Windows实例提示“出现身份验证错误,无法连接到本地安全机构”错误怎么办?

本文介绍通过远程桌面连接Windows实例提示“出现身份验证错误无法连接到本地安全机构”错误的解决方案。 问题现象 通过本地电脑内的远程桌面连接Windows实例提示“出现身份验证错误&#xff0c;无法连接到本地安全机构”错误。 问题原因 导致该问题的可能原因如下&#x…

百度golang研发一面面经

输入一个网址&#xff0c;到显示界面&#xff0c;中间的过程是怎样的 IP 报文段的结构是什么 Innodb 的底层结构 知道几种设计模式 工厂模式 简单工厂模式&#xff1a;根据传入类型参数判断创建哪种类型对象工厂方法模式&#xff1a;由子类决定实例化哪个类抽象工厂模式&#…

TC3xx学习笔记-启动过程详解(一)

文章目录 前言Firmware启动过程BMHD Check流程ABM启动Internal Flash启动Bootloader ModeProcessing in case no valid BMHD foundProcessing in case no Boot Mode configured by SSW 总结 前言 之前介绍过UCB BMHD的使用&#xff0c;它在启动过程中起着重要的作用&#xff0…

Scratch节日 | 六一儿童节抓糖果

六一儿童节怎么能没有糖果&#xff1f;这款 六一儿童节抓糖果 小游戏&#xff0c;让你变身小猫&#xff0c;开启一场甜蜜大作战&#xff01; &#x1f3ae; 游戏玩法 帮助小猫收集所有丢失的糖果&#xff0c;收集越多分数越高&#xff01; 小心虫子一样的“坏糖果”&#xff…

通信算法之280:无人机侦测模块知识框架思维导图

1. 无人机侦测模块知识框架思维导图, 见文末章节。 2. OFDM参数估计,基于循环自相关特性。 3. 无人机其它参数估计

【Doris基础】Apache Doris中的Coordinator节点作用详解

目录 1 Doris架构概述 2 Coordinator节点的核心作用 2.1 查询协调与调度 2.2 执行计划生成与优化 2.3 资源管理与负载均衡 2.4 容错与故障恢复 3 Coordinator节点的关键实现机制 3.1 两阶段执行模型 3.2 流水线执行引擎 3.3 分布式事务管理 4 Coordinator节点的高可…

【Kubernetes-1.30】--containerd部署

文章目录 一、环境准备1.1 三台服务器1.2 基础配置&#xff08;三台机通用&#xff09;1.3 关闭 Swap&#xff08;必须&#xff09;1.4 关闭防火墙&#xff08;可选&#xff09;1.5 加载必要模块 & 配置内核参数 二、安装容器运行时&#xff08;containerd 推荐&#xff09…

相机--相机标定

教程 内外参公式及讲解 相机标定分类 相机标定分为内参标定和外参标定。 相机成像原理 相机成像畸变 链接 四个坐标系的转变 内参标定 内参 相机内参通常用一个 33 矩阵&#xff08;内参矩阵&#xff0c;KK&#xff09;表示&#xff0c;形式如下&#xff1a; (1)焦距&…

MongoDB(七) - MongoDB副本集安装与配置

文章目录 前言一、下载MongoDB1. 下载MongoDB2. 上传安装包3. 创建相关目录 二、安装配置MongoDB1. 解压MongoDB安装包2. 重命名MongoDB文件夹名称3. 修改配置文件4. 分发MongoDB文件夹5. 配置环境变量6. 启动副本集7. 进入MongoDB客户端8. 初始化副本集8.1 初始化副本集8.2 添…

131. 分割回文串-两种回溯思路

我们可以将字符串分割成若干回文子串&#xff0c;返回所有可能的方案。如果将问题分解&#xff0c;可以表示为分割长度为n-1的子字符串&#xff0c;这与原问题性质相同&#xff0c;因此可以采用递归方法解决。 为什么回溯与递归存在联系&#xff1f;在解决这个问题时&#xff0…

[Java恶补day13] 53. 最大子数组和

休息了一天&#xff0c;开始补上&#xff01; 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums …

摩尔投票算法原理实现一文剖析

摩尔投票算法原理&实现一文剖析 一、算法原理1.1 基本思想1.2 数学原理 二、算法实现2.1 Python实现2.2 Java实现2.3 C实现 三、复杂度分析四、应用场景4.1 多数元素问题4.2 扩展应用&#xff1a;寻找出现次数超过n/3的元素 五、算法优势与注意事项5.1 优势5.2 注意事项 总…