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

文章目录

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

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

相关文章

人工智能100问☞第36问:什么是BERT?

目录 一、通俗解释 二、专业解析 三、权威参考 BERT是基于Transformer Encoder的双向语言预训练模型,具备强大的语义理解能力,是现代自然语言处理的重要基石。它是一套让机器像人一样“前后一起看”的语言理解技术,它让AI不光“读得快”,还“读得懂”。现在很多搜索引擎…

Chrome/ Edge 浏览器弹出窗口隐藏菜单地址栏

Chrome 利用快捷方式,打开一个无地址栏的浏览器窗口,以百度为例 创建浏览器快捷方式,在目标栏里 添加 -apphttps://www.baidu.com 点击【应用】,【确定】按钮保存生效。后面通过空上快捷方式打开的浏览器没有地址栏。 Edge浏览…

计算机网络常见体系结构、分层必要性、分层设计思想以及专用术语介绍

计算机网络体系结构 从本此开始,我们就要开始介绍有关计算机网络体系结构的知识了。内容包括: 常见的计算机网络体系结构 计算机网络体系结构分层的必要性 计算机网络体系结构的设计思想 举例说明及专用术语 计算机网络体系结构是计算机网络课程中…

【C++】“多态”特性

文章目录 一、多态的概念二、多态的定义实现1. 多态的构成条件1.1 虚函数1.2 虚函数的重写 2. 多态的调用3. 虚函数重写的其他问题3.1 协变3.2 析构函数的重写 三、override和final关键字四、重载/重写/隐藏的对比五、纯虚函数和抽象类六、多态的原理 C的三大主要特性&#xff…

2025.5.27学习日记 linux三剑客 sed与正则表达式

sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器。 sed是操作、过滤和转换文本内容的强大工具。 常用功能包括结合正则表达式对文件实现快速增删改查 , 其中查询的功能中最常用的两大功能是过 滤 ( 过滤指定字符串)、取行(取出指定行)。 注意sed和awk使用单引号,双引号…

文科小白学习Linux系统之安全管理

目录 前言 一、SELinux安全上下文 1、SELinux 简介 2、基础操作命令 1. 查看SELinux状态 2. 切换工作模式 3、安全上下文(Security Context) 1. 查看上下文 2. 修改上下文 chcon命令 semanage 命令 4、SELinux布尔值(Booleans&am…

企业内训系统源码开发详解:直播+录播+考试的混合式学习平台搭建

在企业数字化转型的大潮中,员工培训早已不再是传统教室中的一场场“走过场”,而是通过技术驱动的“系统化能力提升”。尤其在知识更新换代加速、竞争压力日益激烈的背景下,企业越来越倾向于建设自主可控、功能灵活、支持多种学习形态的内训平…

智能化报销与精细化管理:购物小票识别系统全面提升企业运营效率

在现代企业管理中,购物小票的处理一直是财务和运营管理中的一项挑战。尤其在企业费用报销、会员管理、库存监控等环节,手动整理与核对小票不仅耗时费力,还容易产生错误。随着人工智能技术的发展,企业亟需一种高效、智能的解决方案…

毫秒级数据采集的极致优化:如何用C#实现高性能、无冗余的实时文件写入?

在工业控制、通信系统或高频交易领域,毫秒级数据采集的精度直接决定系统性能。但一个棘手问题常被忽视:如何处理同一毫秒内的重复数据? 若简单写入所有数据,会导致文件臃肿、分析效率骤降;若处理不当,又可能…

NLua性能对比:C#注册函数 vs 纯Lua实现

引言 在NLua开发中,我们常面临一个重要选择:将C#函数注册到Lua环境调用,还是直接在Lua中实现逻辑? 直觉告诉我们,C#作为编译型语言性能更高,但跨语言调用的开销是否会影响整体性能?本文通过基准…

go并发与锁之sync.Mutex入门

sync.Mutex 原理:一个共享的变量,哪个线程握到了,哪个线程可以执行代码 功能:一个性能不错的悲观锁,使用方式和Java的ReentrantLock很像,就是手动Lock,手动UnLock。 使用例子: v…

【HarmonyOS5】DevEco Studio 使用指南:代码阅读与编辑功能详解

⭐本期内容:【HarmonyOS5】DevEco Studio 使用指南:代码阅读与编辑功能详解 🏆系列专栏:鸿蒙HarmonyOS:探索未来智能生态新纪元 文章目录 前言代码阅读代码导航功能代码折叠语法高亮跨语言跳转代码查找 快速查阅API接口…

【Python 深度学习】1D~3D iou计算

一维iou 二维 import numpy as npdef iou_1d(set_a, set_b):# 获得集合A和B的边界 x1, x2 set_ay1, y2 set_b# 计算交集的上下界low max(x1,y1)high - min(x2, y2)# 计算交集if high - low < 0:inter 0else:inter high - low# 计算并集union (x2 -x1) (y2 - y1) - in…

SpringBoot Controller接收参数方式, @RequestMapping

一. 通过原始的HttpServletRequest对象获取请求参数 二. 通过Spring提供的RequestParam注解&#xff0c;将请求参数绑定给方法参数 三. 如果请求参数名与形参变量名相同&#xff0c;直接定义方法形参即可接收。(省略RequestParam) 四. JSON格式的请求参数(POST、PUT) 主要在PO…

智能防护实战:从攻击成本看企业安全降本增效

1. 网络攻击的低成本与高回报陷阱 暗网中&#xff0c;一次完整的网络钓鱼攻击仅需30美元/月起步&#xff0c;而勒索软件攻击成本平均1000美元&#xff0c;却能导致企业损失高达445万美元&#xff08;IBM 2023年数据&#xff09;。例如&#xff0c;信用卡信息每条仅售10美元&am…

大语言模型 20 - MCP 在客户端中使用 Cursor Cline 中配置 MCP 服务

MCP 基本介绍 官方地址&#xff1a; https://modelcontextprotocol.io/introduction “MCP 是一种开放协议&#xff0c;旨在标准化应用程序向大型语言模型&#xff08;LLM&#xff09;提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…

MySQL 在 CentOS 7 环境下的安装教程

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习Mysql的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…

WPF的基础设施:XAML基础语法

XAML基础语法 1 控件声明与属性设置1.1 特性语法&#xff08;Attribute Syntax&#xff09;1.2 属性元素语法&#xff08;Property Element Syntax&#xff09;1.3 特殊值标记扩展 2 x:Name与Name的区别3 注释与代码折叠4 实用技巧集合5 常见错误排查 XAML( Extensible Applic…

机器学习笔记【Week3】

一、逻辑回归&#xff08;Logistic Regression&#xff09; 与线性回归的区别&#xff1a; 问题类型输出类型举例回归问题连续实数房价预测、气温预测分类问题离散类别&#xff08;0 或 1&#xff09;是否患病、是否点击广告、是否合格 我们希望构建一个模型&#xff0c;根据…

6.4.2_3最短路径问题_Floyd算法

Floyd弗洛伊德 膜拜大佬&#xff0c;给大佬鞠躬鞠躬鞠躬。。。。。。。。。 Floyd算法 ----解决顶点间的最短路径&#xff1a; 过程&#xff1a; 如下&#xff1a; 初始化(没有中转点)&#xff1a;2个邻接矩阵A和path&#xff0c;第一个是没有中转点的2个顶点之间的最短路径…