Opencv项目实战:基于dlib的人脸关键点检测

news2024/12/27 13:34:38

文章目录

  • 一、项目简介
  • 二、环境配置
    • 2.1、dlib人脸检测器:dlib.get_frontal_face_detector()
    • 2.2、dlib关键点定位工具:shape_predictor_68_face_landmarks.dat
  • 三、项目实战

一、项目简介

该项目基于dlib模块提供的人脸检测器以及关键点定位工具完成。首先通过检测器在图像中定位人脸的位置,然后通过关键点定位工具提取脸部关键点坐标,最后绘制脸部特征点。

二、环境配置

  • dlib是一个c++库,其包含了很多有用的预训练工具。
  • dlib工具的python API下载地址:http://dlib.net/python/
  • dlib库包的介绍与使用:opencv+dlib人脸检测 + 人脸68关键点检测 + 人脸识别 + 人脸特征聚类 + 目标跟踪

2.1、dlib人脸检测器:dlib.get_frontal_face_detector()

dlib官方详细说明:dlib.get_frontal_face_detector()

2.2、dlib关键点定位工具:shape_predictor_68_face_landmarks.dat

dlib官方预训练工具的下载地址:http://dlib.net/files/
(1)5个关键点检测:shape_predictor_5_face_landmarks.dat。五个点分别为:左右眼 + 鼻子 + 左右嘴角
(2)68个关键点检测:shape_predictor_68_face_landmarks.dat

脸部关键点注释详细请看:https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/
在这里插入图片描述

三、项目实战

  • 【参数配置】方式一:Pycharm + Terminal + 输入指令自动检测:python detect_face_parts.py --shape-predictor shape_predictor_68_face_landmarks.dat --image images/1.jpg
  • 【参数配置】方式二:Pycharm + 点击Edit Configuration,输入配置参数--shape-predictor shape_predictor_68_face_landmarks.dat --image images/1.jpg,点击Run开始检测。

在这里插入图片描述

from collections import OrderedDict
import numpy as np
import argparse
import dlib
import cv2

#https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/
#http://dlib.net/files/


def shape_to_np(shape, dtype="int"):
	"""获取68个关键点的坐标,并转换为ndarray格式"""
	# (1)创建68*2模板。68个关键点坐标(x,y)
	coords = np.zeros((shape.num_parts, 2), dtype=dtype)
	# (2)遍历每一个关键点, 得到坐标(x,y)
	for i in range(0, shape.num_parts):
		coords[i] = (shape.part(i).x, shape.part(i).y)
	return coords


def visualize_facial_landmarks(image, shape, colors=None, alpha=0.75):
	"""可视化脸部位置"""
	overlay = image.copy()		# 绘制图像
	output = image.copy()		# 输出图像
	# (1)设置七个颜色,分别对应脸部的七个位置
	if colors is None:
		colors = [(19, 199, 109), (79, 76, 240), (230, 159, 23), (168, 100, 168), (158, 163, 32), (163, 38, 32), (180, 42, 220)]
	# (2)遍历每一个区域(七个脸部位置)
	for (i, name) in enumerate(FACIAL_LANDMARKS_68_IDXS.keys()):
		# 获取当前区域68个关键点的坐标
		(j, k) = FACIAL_LANDMARKS_68_IDXS[name]
		pts = shape[j:k]
		# 检查脸部位置
		if name == "jaw":		# 下巴使用线条绘制
			for l in range(1, len(pts)):
				ptA = tuple(pts[l - 1])
				ptB = tuple(pts[l])
				cv2.line(overlay, ptA, ptB, colors[i], 2)				# 绘制线条
		else:					# 其余位置使用凸包绘制
			hull = cv2.convexHull(pts)									# 计算凸包
			cv2.drawContours(overlay, [hull], -1, colors[i], -1)		# 绘制凸包
	# (3)图像融合
	cv2.addWeighted(overlay, alpha, output, 1 - alpha, 0, output)
	return output


if __name__ == '__main__':
	###################################################################################################################
	# (1)参数配置
	ap = argparse.ArgumentParser()
	# 		【参数1】面部地标预测器路径: shape_predictor_68_face_landmarks.dat
	ap.add_argument("-p", "--shape-predictor", required=True, help="path to facial landmark predictor")
	# 		【参数2】待检测图像的存放路径
	ap.add_argument("-i", "--image", required=True, help="path to input image")
	args = vars(ap.parse_args())

	# (2)68个关键点与5个关键点(嘴 + 右眉毛 + 左眉毛 + 右眼 + 左眼 + 鼻子 + 下巴)
	# from collections import OrderedDict 由于字典是无序的,故导入模块使得字典有序。因为需要按指定顺序提取,以识别当前数据。
	FACIAL_LANDMARKS_68_IDXS = OrderedDict([("mouth", (48, 68)),
											("right_eyebrow", (17, 22)),
											("left_eyebrow", (22, 27)),
											("right_eye", (36, 42)),
											("left_eye", (42, 48)),
											("nose", (27, 36)),
											("jaw", (0, 17))])
	FACIAL_LANDMARKS_5_IDXS = OrderedDict([("right_eye", (2, 3)), ("left_eye", (0, 1)), ("nose", 4)])
	###################################################################################################################
	# (1)先检测人脸,然后定位脸部的关键点。优点: 与直接在图像中定位关键点相比,准确度更高。
	detector = dlib.get_frontal_face_detector()							# 1.1、基于dlib的人脸检测器
	predictor = dlib.shape_predictor(args["shape_predictor"])			# 1.2、基于dlib的关键点定位(68个关键点)

	# (2)图像预处理
	image = cv2.imread(args["image"])									# 2.1、读取图像
	(h, w) = image.shape[:2]		# 获取图像的宽和高
	width = 500						# 指定宽度
	r = width / float(w)			# 计算比例
	dim = (width, int(h * r))		# 按比例缩放高度: (宽, 高)
	image = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)		# 2.2、图像缩放
	gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)						# 2.3、灰度图

	# (3)人脸检测
	rects = detector(gray, 1)				# 若有多个目标,则返回多个人脸框

	# (4)遍历检测得到的【人脸框 + 关键点】
	for (i, rect) in enumerate(rects):		# rect: 人脸框
		shape = predictor(gray, rect)		# 4.1、定位脸部的关键点(返回的是一个结构体信息,需要遍历提取坐标)
		shape = shape_to_np(shape)			# 4.2、遍历shape提取坐标并进行格式转换: ndarray

		# 4.3、遍历当前框的所有关键点(name: 脸部位置。i,j表示脸部的坐标。)
		for (name, (i, j)) in FACIAL_LANDMARKS_68_IDXS.items():
			clone = image.copy()
			cv2.putText(clone, name, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)		# 在图像的指定位置显示当前脸部位置的名称
			# 4.4、根据脸部位置画点(每个脸部由多个关键点组成)
			for (x, y) in shape[i:j]:
				cv2.circle(clone, (x, y), 3, (0, 0, 255), -1)
			# 4.5、提取ROI区域(即截取脸部位置)
			(x, y, w, h) = cv2.boundingRect(np.array([shape[i:j]]))			# 矩形框得到坐标
			roi = image[y:y + h, x:x + w]									# 获取ROI区域
			(h, w) = roi.shape[:2]											# 获取ROI宽和高
			width = 250														# 指定宽度
			r = width / float(w)											# 计算比例
			dim = (width, int(h * r))										# 按比例缩放高度: (宽, 高)
			roi = cv2.resize(roi, dim, interpolation=cv2.INTER_AREA)		# 图像缩放

			# 4.6、显示图像
			cv2.imshow("ROI", roi)			# 将当前脸部位置截取出来
			cv2.imshow("Image", clone)		# 显示带有关键点特征的图像
			cv2.waitKey(0)

		# 可视化脸部位置
		output = visualize_facial_landmarks(image, shape)
		cv2.imshow("Image", output)
		cv2.waitKey(0)

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

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

相关文章

大数据:hive数据库的操作语法,数据表,内部表,external外部表,数据导入导出load,insert

大数据: 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql要学&#x…

chatgpt赋能python:关于Python中打开文件的语句详解

关于Python中打开文件的语句详解 在Python中,打开文件是一项常见的任务,可以用于读写文件和进行日志记录。本文将介绍Python中打开文件的语句,并提供一些实用技巧,以便方便地管理文件。 为什么需要打开文件? 在计算…

【动态规划】通配符匹配与正则表达式匹配

文章目录 一、通配符匹配1.1 思路分析1.2 初始化处理1.3 代码1.4 优化 二、正则表达式匹配2.1 思路分析2.2 初始化设置2.3 代码 一、通配符匹配 题目描述: 给你一个输入字符串 (s) 和一个字符模式 ,请你实现一个支持 ‘?’ 和 ‘*’ 匹配规则的通配符…

如何在Github上免费部署网站

如何在Github上免费部署静态网站 背景一、新建仓库(github账号的需要注册)二、下载仓库三、将内容上传到远程仓库里四、启动Page服务 背景 部署网站需要服务器,但是如果你只是部署静态网站就可以蹭Github上的免费服务器。因为发现现在的过程…

基于springboot+Redis的前后端分离项目(一)-【黑马点评】

🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码:eh11 基于session和redis实现登录 (一)前言(二)导入资源(三)短信…

Spring数据库事务处理

数据库事务的基本知识 ACID 两类丢失更新 事务回滚丢失更新: 目前大部分数据库已经通过锁的机制来避免了事务回滚丢失更新。 数据库锁的机制: 锁可以分为乐观锁和悲观锁,而悲观锁又分为:读锁(共享锁)和写锁(排它锁),…

chatgpt赋能python:使用Python制作动画的步骤和工具

使用Python制作动画的步骤和工具 Python不仅是一种流行的编程语言,还可以用于制作动画。本文将介绍一些基本步骤和工具,帮助你制作出精美的动画作品。 步骤一:选择一个好的动画框架 Python有很多强大的动画框架可以使用。其中一些最受欢迎…

chatgpt赋能python:Python删除目录下文件:介绍和方法

Python删除目录下文件:介绍和方法 在日常的开发和运维工作中,我们可能会需要删除某个目录下的一些文件。使用Python的好处在于其强大的处理能力和简单易用的语法。本文将介绍Python删除目录下文件的方法,并提供一些实用的代码示例。 使用os…

java-数组和方法

java-数组和方法 一、数组 1.1 概念 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。 1.2 定义格式 第一种 数据类型 [] 数组名 例: int[] arr; double[] arr; char[] arr;第二种 数据类型 数组名[] 例: int arr[]; doubl…

交流有功功率、无功功率、视在功率计算

交流有功功率、无功功率、视在功率计算 1、有功功率2、无功功率3、视在功率4、功率因数5、总结 1、有功功率 有功功率:在交流电路中,每个瞬时的有功功率是不同的,且不断变化,一般用平均有功功率(一个周期内功率的平均…

黑盒测试用例设计练习题

1、准考证号码 对招干考试系统“输入学生成绩”子模块设计测试用例。招干考试分三个专业,准考证号第一位为专业代号,如: 1-行政专业, 2-法律专业, 3-财经专业。 行政专业准考证号码为:110001~111215 法律专…

chatgpt赋能python:Python数据清洗:如何剔除异常值

Python 数据清洗:如何剔除异常值 随着数据量的持续增长,数据清洗已经成为了数据分析中不可或缺的一个步骤。数据清洗的目的是去除错误、缺失或不必要的数据,从而使数据更加准确、可靠、一致和完整。本文将讲解如何使用 Python 编程语言来剔除…

【C++ 程序设计】第 2 章:面向对象的基本概念

目录 一、结构化程序设计 二、面向对象程序设计的概念和特点 (1)面向对象程序设计的概念 (2)面向对象程序设计的特点 三、类的初步知识 (1)类的定义 (2)类的定义示例 四、类…

Three.js--》实现3d踢球模型展示

目录 项目搭建 初始化three.js基础代码 设置环境纹理加载模型 使用Cannon-es实现物理世界 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本…

Linux4.6LNMP架构

文章目录 计算机系统5G云计算第五章 LINUX LNMP架构一、安装 Nginx 服务1.关闭防火墙,将安装nginx所需软件包传到/opt目录下2.安装依赖包3.创建运行用户、组4.编译安装Nginx5.添加 Nginx 系统服务6.修改nginx服务配置文件 三、编译安装mysqld 服务1.将安装mysql 所需…

MySQL—存储引擎(下)

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️树高千尺,落叶归根人生不易&…

Windows部署WSL开启pwn之旅

不用虚拟机来操作真的太爽了!!还有和vscode的联动,更是妙绝! 目录 前言 一、WSL获取 开启WSL支持 二、各种操作 1.apt 换源 2.更新软件 3.配置SSH服务器(对于pwn来说非必要) 4.WSL访问windows文件 …

【ChatGPT 】国内无需注册 openai 即可访问 ChatGPT:WeTab 浏览器扩展程序的安装与使用

目录 一、Sider:每天免费 30 查询额度【暂不推荐】 (1)Edge 浏览器扩展程序:Sider - ChatGPT【暂不推荐】 (2)iOS 手机 APP:Sider- Al 搭档(有需要可以安装) 二、 We…

chatgpt赋能python:Python创建画布的教程

Python 创建画布的教程 Python是一个功能强大的编程语言,其中一个重要的应用是数据可视化。在数据科学、机器学习、图像处理和软件开发中,Python的可视化功能非常实用。本教程将介绍Python创建画布的步骤,以及如何使用Matplotlib创建简单的图…

生产案例:消息堆积排查分析

📝作者简介: 大家好,我是CBeann,CSDN博客专家,阿里云专家博主。 22届校招进入阿里广告部门从事Java开发工程师。 平时有空会帮大家解决问题,模式面试和日常答疑,并且提供免费云服务器使用。 有一…