《深度学习》Dlib、OpenCV 关键点定位 原理及案例解析

news/2024/10/18 9:50:14/

目录

一、关键点定位

1、什么是关键点定位

2、步骤

1)加载预训练的人脸检测器

2)加载预训练的关键点检测器

3)读取图像

4)检测人脸

5)关键点检测

6)可视化关键点

7)显示图像

二、案例实现

1、定位图片关键点

1)调试模式

2)运行结果

2、摄像头实时定位

运行结果:


一、关键点定位

1、什么是关键点定位

        关键点定位是指在人脸图像中自动定位人脸的关键点,如眼睛、鼻子、嘴巴等特征点。

        在dlib中,通过使用预训练的模型(如shape_predictor_68_face_landmarks.dat)来实现,该模型可以检测并标定68个面部特征点,这些特征点包括脸颊、眉毛、眼睛、鼻子、嘴巴等部位的关键点,通过它们可以对人脸进行更深入的分析和处理。

2、步骤

        1)加载预训练的人脸检测器

                使用dlibget_frontal_face_detector()函数加载预训练的人脸检测器模型。

        2)加载预训练的关键点检测器

                使用dlibshape_predictor()函数加载预训练的关键点检测器模型。

        3)读取图像

                使用OpenCV的imread()函数读取图像。

        4)检测人脸

                使用人脸检测器模型来检测图像中的人脸。调用detector()函数可以返回一个包含人脸位置的矩形列表。

        5)关键点检测

                对于每个检测到的人脸,使用关键点检测器模型来检测人脸的关键点。调用predictor()函数可以返回一个包含关键点位置的对象。

        6)可视化关键点

                使用OpenCV的circle()函数,在图像上绘制检测到的关键点。

        7)显示图像

                使用OpenCV的imshow()函数显示带有关键点的图像。

二、案例实现

1、定位图片关键点

import numpy as np
import cv2
import dlibimg = cv2.imread("renlian.png")   # 读取图像
detector = dlib.get_frontal_face_detector()   # 构造人脸检测器
faces = detector(img,0)   # 使用检测器来检测人脸,0表示对图像进行上采样的次数为0
# dlib.shape_predictor载入模型(加获预测器)
# 可以从https://github.com/davisking/dlib-models下载  xmlopencv自己训练好的特征
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")  # 加载预训练模型,用于定位人脸的68个关键点
for face in faces:  # 遍历每一张脸,然后在上面绘制关键点shape = predictor(img,face)  # 获取关键点# 将关键点转换为坐标(x,y)的形式#landmarks = np.matrix([lp.x,p.y]for p in shape.parts()])landmarks = np.array([[p.x,p.y] for p in shape.parts()])  # shape.parts()返回一个包含所有人脸关键点的迭代器,遍历出来每张人脸的关键点坐标再传入列表然后将其转换为矩阵类型for idx, point in enumerate(landmarks):    # 使用enumerate将每个关键点的索引和值遍历除去pos = [point[0], point[1]]  # 获取当前关键的坐标cv2.circle(img, pos,  2, color=(0, 255, 0), thickness=-1)   # 针对当前关键点,绘制一个圆,结尾的-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(0)
cv2.destroyAllWindows()
        1)调试模式

        2)运行结果

2、摄像头实时定位

import numpy as np
import cv2
import dlibcap = cv2.VideoCapture('笑容.mp4')   # 打开视频文件
# cap = cv2.VideoCapture(0)   # 调用摄像头if not cap.isOpened():   # 如果打开失败print("Cannot open camera")exit()  # 终止程序detector = dlib.get_frontal_face_detector()   # 构造人脸检测器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")   # 导入人脸关键点检测的预训练模型,检测人脸的68个特征点while True:  # 建立死循环,用来不停地读取视频的每一帧画面ret, img = cap.read()  # 读取视频帧,返回读入状态的布尔值和图片,一次读取一帧画面if not ret:  # 读取失败,则退出循环print("不能读取摄像头")breakfaces = detector(img,0)   # 调用人脸检测器,检测人脸for face in faces:   # 获取每一张脸的关键点(实现检测)shape = predictor(img,face)  # 获取关键点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, color=(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)k = cv2.waitKey(20)  # 每一帧画面执行20毫秒if k == 27:  # 如果键盘点击esc键,终止循环break
# 释放资源
cv2.destroyAllWindows()
        运行结果:


http://www.ppmy.cn/news/1539964.html

相关文章

LINUX (s-nail)定时发邮件

作业要求 在linux主机通过定时任务指定在每天12:12分定时发送邮件;邮件内容自定。 ssh 192.168.169.128 [rootlocalhost ~]# mount /dev/sr0 /mnt [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [BaseOS] nameBaseOS baseurlfile:///mnt/BaseOS gpgcheck0 […

DNS:互联网域名系统的核心

什么是 DNS? DNS(Domain Name System,域名系统)是互联网的一项基础服务,它负责将人类容易记忆的域名(如 www.example.com)转换成计算机可以识别的 IP 地址(如 192.0.2.1&#xff09…

Flume面试整理-配置文件格式

Apache Flume的配置文件采用简单的文本格式来定义和配置Source(源)、Channel(通道)和Sink(汇),以实现数据流的管理。配置文件通常以.conf为扩展名,每个配置文件定义一个或多个Flume Agent的属性和行为。以下是Flume配置文件格式的详细介绍: Flume配置文件的基本结构 一…

WPF 学习:知识要点、学习资源推荐

一、引言 在当今数字化时代,Windows 桌面应用程序的开发依旧占据着重要地位。Windows Presentation Foundation(WPF)作为微软精心打造的用于构建 Windows 桌面应用程序的强大框架,为开发者开辟了一片充满创意与可能性的天地。它融…

人工智能学习框架

1. 基础知识 1.1 数学基础(细化) 1.1.1 线性代数 向量与矩阵 : 向量:如 x(x1,x2,…,xn)\mathbf{x} (x_1, x_2, …, x_n)x(x1,x2,…,xn) 是一维的数值数组,表示空间中的点或方向。矩阵:二维数值表&#x…

基于SpringBoot+Vue+Uniapp汽车保养系统小程序的设计与实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而…

Helm入门到实战演示

目录 1、Helm介绍 2、Helm v3版本变化 3、安装Helm v3 4、配置国内存放chart仓库的地址 5、Helm基本使用 5.1 搜索和下载Chart 5.2 部署chart 5.2.1 helm部署memcached服务 5.3 release相关操作 6、自定义Chart模板 6.1 自定义一个Chart 6.2 Chart.yaml编写规则 6.…

波克 上海 Unity开发笔试题 2024

波克 Unity开发笔试题 2024 主要分为四部分 如果没有准备好,不要点击笔试链接,进入就会自动开始 Unity 1.Unity生命周期执行顺序 Awake → OnEnable → Start → FixedUpdate → Update → LateUpdate 2.阅读代码,可能会出现哪些问题? string cnt = ""; lis…