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

article/2025/9/8 2:25:07

文章目录

  • 一、什么是人脸关键点定位?
  • 二、关键点模型的下载及关键信息的理解
  • 三、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.hkcw.cn/article/rqOSuubUyH.shtml

相关文章

【Java】线程池的实现原理是怎样的?CPU密集型任务与IO密集型任务的区别?

一、CPU密集型与IO密集型任务 1.CPU密集型任务(CPU-bound) 定义:需要大量CPU计算资源,大部分时间都在进行运算的任务。 这类任务的特点是计算量大,CPU占用率高。 特点: 主要消耗CPU资源执行速度取决于CPU的计算能力通常涉及复…

【QT】理解QT的“元对象系统”

目录 前置知识: (1)C运行时多态 (2)RTTI QT的元对象系统 1.元对象系统基本内容 2.元对象代码 3.元对象系统其它特性 前置知识: (1)C运行时多态 C的运行时多态是由虚函数和继…

Windows Server 2019--10 网络地址转换

本章要点 了解 NAT 技术的核心原理。掌握 NAT 技术的应用。掌握 NAT 网关的配置。 IP 地址分为两类,分别是私有IP地址(Private IP)与公用IP地址(Public IP)。 位于内部网络中的计算机使用的是私有IP地址,其不需要向IP地址发放机构提出申请。私有IP地址…

掌握STP技术:网络环路终结者实战

实验目的 理解生成树协议(STP)的基本原理及其在网络中的作用。掌握STP的配置方法,包括根桥选举、端口状态转换等关键机制。通过实验验证STP如何防止网络环路并实现冗余路径的优化管理。 实验环境 设备:支持STP的交换机&#xf…

通义灵码2.5——基于MCP打造我的12306火车票智能查询小助手

前沿技术应用全景图 本项目作为通义灵码2.5的标杆实践案例,展现了AI辅助开发在复杂业务系统中的革命性突破。通过深度集成12306 MCP服务体系,我们构建了一个融合智能决策、环境感知和自主优化的新一代火车票查询系统。 #mermaid-svg-4D7QqwJjsQRdKVP7 {…

不可变集合类型转换异常

记录一个异常:class java.util.ImmutableCollections$ListN cannot be cast to class java.util.ArrayList (java.util.ImmutableCollections$ListN and java.util.ArrayList 文章目录 1、原因2、解决方式一3、解决方式二4、关于不可变集合的补充4.1 JDK8和9的对比4…

初学python的我开始Leetcode题10-1

提示:100道LeetCode热题10-1主要是回溯相关,包括四题:全排列、子集、电话号码的字母组合、组合总和。由于初学,所以我的代码部分仅供参考。 前言 下周是第十六周,然后是两周的期末周,所以马上会缺两周左右…

IPTV电视直播 1.6.0 | 手机电视直播 秒播无卡顿

电视直播是一款功能强大且用户体验优秀的电视直播软件。它提供了丰富的节目资源,并支持高清画质播放,无论是家庭娱乐、移动办公还是学习,都能满足用户的需求。该应用完全无广告、无弹窗,确保用户享受纯净的观看体验。此外&#xf…

BugKu Web渗透之备份是个好习惯

启动场景后,网页显示一段字符串。 看起来像md5值,但是又过长了。 步骤一:右键查看源代码,没有发现任何异常。 步骤二:使用dirsearch去查看是否有其他可疑文件。 在终端输入: dirsearch -u http://117.72.…

深入理解 SELinux:通过 Nginx 和 SSH 服务配置实践安全上下文与端口策略

目录 一、引言 二、实验环境说明 三、实验 1:Nginx 服务安全上下文配置 3.1 实验目标 3.2 操作步骤 1. 开启 SELinux 并重启系统 2. 安装 Nginx 并创建自定义目录 3. 配置 Nginx 指向自定义目录 4. 分析 SELinux 上下文冲突 5. 修改上下文为合法类型 6. 验…

Linux 开发工具

1.sudo白名单 我们如果要让普通用户有sudo的权限 我们就要登录root用户 在/etc/sudoers目录下 通过文本编辑器(我用的是vim) 将要添加的用户 直接添加进去 如下图光标行就是我添加的白名单用户 然后我们添加的这个ly_centos就有sudo的权限了 2.gcc…

React 第四十九节 Router中useNavigation的具体使用详解及注意事项

前言 useNavigation 是 React Router 中一个强大的钩子,用于获取当前页面导航的状态信息。 它可以帮助开发者根据导航状态优化用户体验,如显示加载指示器、防止重复提交等。 一、useNavigation核心用途 检测导航状态:判断当前是否正在进行…

从数据持久化到网络通信与OpenCV:Qt应用程序开发的深度探索与实战

文章目录 前言一、QSettings:轻量级数据持久化方案1.1 QSettings 主要特点1.2 QSettings 常用函数整理 二、数据库2.1 连接SQLite数据库2.2 建表2.3 增删改 三、网络编程3.1 网络分层3.2 IP地址3.3 端口号3.4 基于TCP的Socket通信3.4 相关接口3.4.1核心类3.4.2 通信…

【产品经理从0到1】自媒体端产品设计

后台的定义 “后台” 与“前台”都是相对独立的平台,前台是服务于互联网用户的平台 ,后台主要是支撑前台页面内容、数据及对前台业务情况的统计分析的系统; 后台与前台的区别 第1:使用用户不同 前台用户:互联网用户…

Ubuntu20.04操作系统ssh开启oot账户登录

文章目录 1 前提2 设置root密码3 允许ssh登录root账户3.1 编辑配置文件3.2 重启ssh服务 4 安全注意事项 1 前提 ssh可以使用普通用户正常登录。 2 设置root密码 打开终端,设置密码 sudo passwd root # 设置root密码3 允许ssh登录root账户 3.1 编辑配置文件 su…

四叉树实现四边形网格

import matplotlib.pyplot as plt import matplotlib.patches as patches import numpy as np # 四叉树节点 class QuadNode:def __init__(self, x, y, width, height, depth):self.x xself.y yself.width widthself.height heightself.depth depthself.children []self.…

园区智能化集成平台汇报方案

该方案为园区智能化集成平台设计,依据《智能建筑设计标准》等 20 余项国家与行业规范,针对传统园区信息孤岛、反应滞后、经验流失、管理粗放等痛点,构建可视化智慧园区管理平台,实现大屏数据可视化、三维设备监控、智慧运维(含工单管理、巡检打卡)、能源能耗分析、AI 安防…

C#中的BeginInvoke和EndInvoke:异步编程的双剑客

文章目录 引言1. BeginInvoke和EndInvoke的基本概念1.1 什么是BeginInvoke和EndInvoke1.2 重要概念解释 2. 委托中的BeginInvoke和EndInvoke2.1 BeginInvoke方法2.2 EndInvoke方法2.3 两者的关系 3. 使用方式与模式3.1 等待模式3.2 轮询模式3.3 等待句柄模式3.4 回调模式 4. 底…

基于通义千问的儿童陪伴学习和成长的智能应用架构。

1.整体架构概览 我们的儿童聊天助手将采用典型的语音交互系统架构,结合大模型能力和外部知识库: 2. 技术方案分解 2.1. 前端应用/设备 选择: 移动App(iOS/Android)、Web应用,或者集成到智能音箱/平板等硬件设备中。技术栈: 移动App: React Native / Flutter (跨平台…

【STIP】安全Transformer推理协议

Secure Transformer Inference Protocol 论文地址:https://arxiv.org/abs/2312.00025 摘要 模型参数和用户数据的安全性对于基于 Transformer 的服务(例如 ChatGPT)至关重要。虽然最近在安全两方协议方面取得的进步成功地解决了服务 Transf…