【进阶OpenCV】 (18)-- Dlib库 --人脸关键点定位

ops/2024/10/18 5:27:04/

文章目录

  • 人脸关键点定位
    • 一、作用
    • 二、原理
    • 三、代码实现
      • 1. 构造人脸检测器
      • 2. 载入模型(加载预测器)
      • 3. 获取关键点
      • 4. 显示图像
      • 5. 完整代码
  • 总结

人脸关键点定位

在dlib库中,有shape_predictor_68_face_landmarks.dat预测器,这是一个用于人脸关键点检测的预训练模型,它能够在人脸图像中定位和识别68个关键点。

一、作用

  1. 人脸关键点定位shape_predictor_68_face_landmarks.dat预测器能够准确地定位人脸的68个关键点,这些关键点涵盖了眼睛、眉毛、鼻子、嘴巴等面部特征。
  2. 辅助其他应用:通过定位这些关键点,该预测器可以为后续的人脸识别、人脸对齐、表情识别、面部动作捕捉等应用提供基础数据支持。

二、原理

  1. 基于机器学习shape_predictor_68_face_landmarks.dat预测器是基于机器学习算法构建的,它通过对大量标注了人脸关键点的图像进行训练,学习人脸关键点的特征。
  2. 模型内部结构
    • 层次化的神经网络:预测器内部包含了多个层次的神经网络,这些网络用于逐步细化面部特征的定位
    • 卷积神经网络(CNN)层:这些层包括卷积层、池化层、全连接层等,它们共同作用于输入图像,提取特征并预测关键点坐标。
  3. 工作流程
    • 加载模型:使用dlib库提供的函数加载shape_predictor_68_face_landmarks.dat预测器模型。
    • 人脸检测:首先使用dlib库的人脸检测器检测图像中的人脸区域。
    • 关键点预测:将检测到的人脸区域作为输入,调用预测器的predict函数,得到68个面部关键点的坐标。
    • 结果可视化:可以将这些关键点在原始图像上标出来,以直观展示面部特征的定位结果。
  4. 训练过程
    • shape_predictor_68_face_landmarks.dat预测器是在大量标注了人脸关键点的图像数据集上训练得到的。
    • 训练过程中,模型会不断调整其参数,以最小化预测关键点位置与实际标注位置之间的误差。

三、代码实现

  • 人脸图像

在这里插入图片描述

1. 构造人脸检测器

import numpy as np
import cv2
import dlibimg = cv2.imread('renlian.jpg')
detector = dlib.get_frontal_face_detector()# 构造人脸检测器
faces = detector(img,0)# 检测人脸

2. 载入模型(加载预测器)

  • 函数方法
dlib.shape_predictor()载入模型
  • 代码
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

3. 获取关键点

  1. 遍历每张脸的关键点,获取关键点
  2. 将关键点转化为坐标形式
  3. 将关键点通过enumerate()函数方法同时获得每个点对应的索引,用于编号
for face in faces: # 获取每一张脸的关键点shape = predictor(img,face) # 获取关键点# 将关键点转换为坐标(x,y)的形式landmarks = np.array([[p.x,p.y] for p in shape.parts()])# 绘制每一张脸的关键点for idx,point in enumerate(landmarks):pos = (point[0],point[1])# 当前关键点坐标# 针对当前关键点,绘制一个实心圆cv2.circle(img,pos,2,(0,255,0),thickness=-1)cv2.putText(img,str(idx),pos,cv2.FONT_HERSHEY_SIMPLEX,0.4,(255,255,255),1,cv2.LINE_AA)

4. 显示图像

cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

5. 完整代码

"""-----关键点定位:定位到人脸的眼睛、鼻子、眉毛、轮廓等-----"""
import numpy as np
import cv2
import dlibimg = cv2.imread('renlian.jpg')
detector = dlib.get_frontal_face_detector()# 构造人脸检测器
faces = detector(img,0)# 检测人脸# dlib.shape_predictor载入模型(加载预测器)
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
for face in faces: # 获取每一张脸的关键点shape = predictor(img,face) # 获取关键点# 将关键点转换为坐标(x,y)的形式landmarks = np.array([[p.x,p.y] for p in shape.parts()])# 绘制每一张脸的关键点for idx,point in enumerate(landmarks):pos = (point[0],point[1])# 当前关键点坐标# 针对当前关键点,绘制一个实心圆cv2.circle(img,pos,2,(0,255,0),thickness=-1)cv2.putText(img,str(idx),pos,cv2.FONT_HERSHEY_SIMPLEX,0.4,(255,255,255),1,cv2.LINE_AA)
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()

总结

本篇介绍了如何通过Dlib库自带的预测器,来进行人脸的关键点定位,并将它显示出来。得到关键点定位后,我们就可以通过点位的距离变换,简单的判断人脸表情变换情况。


http://www.ppmy.cn/ops/126396.html

相关文章

重构长方法之以方法对象取代方法

以方法对象取代方法 是重构长方法的一种技术,适用于那些过长、逻辑复杂且难以拆解的单一方法。此方法通过引入一个新的类,将原本庞杂的方法转化为一个对象方法,这样可以更容易将方法中的不同步骤拆解为多个私有方法,使代码结构清晰…

python实现屏幕录制,录音录制工具

python实现屏幕录制,录音录制工具 一,介绍 Python 实现的屏幕录制和录音录制工具是一个便捷的应用程序,旨在帮助用户同时捕捉计算机屏幕上的活动以及与之相关的音频输出。这个工具尤其针对教育工作者、内容创作者、技术支持人员以及任何需要…

数据库的相关概念

先看与数据库有关的几个名词: DB:database,数据库,里边保存了有组织的规范的数据。 DBMS:database management system , 数据库管理系统,简称数据库软件,数据库产品,数…

Python操作MySQL数据库:基础教程与示例代码

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…

【数据分享】全国资源和环境-环境污染治理投资(1998-2021年)

数据介绍 一级标题指标名称单位指标解释资源和环境环境污染治理投资总额亿元环境污染治理投资指在污染源治理和城市环境基础设施建设的资金投入中,用于形成固定资产的资金,其中污染源治理投资包括工业污染源治理投资和“三同时”项目环保投资两部分。环…

解决高版本使用Gson报错Caused by: java.lang.NoClassDefFoundError: java/sql/Time

开发项目使用jdk21&#xff0c;版本较高&#xff0c;需要用模块化引入。在使用gson转换json数据时&#xff0c;报错 Caused by: java.lang.NoClassDefFoundError: java/sql/Time at gson2.8.5/com.google.gson.Gson.<init>(Gson.java:265) at gson2.8.5/com.google.gson…

ChatGPT写出优质论文的关键第一步:角色预设提示词指令

在使用ChatGPT做学术研究和论文写作中,有效的提示词指令可以帮助我们更好地利用智能AI工具来提升工作效率和质量。在整个操作过程中,首要第一步就是角色预设的指令,这是能否使用ChatGPT高效写出优质论文的关键步骤。以下是五个重要且常用到的学术角色的预设提示词指令 一、…

YZ系列工具之YZ09:VBA_Excel之读心术

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套一部VBA手册&#xff0c;教程分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的…