基于OpenCV的人脸对齐步骤详解及源码实现

目录

  • 1. 前言
  • 2. 人脸对齐基本原理与步骤
  • 3. 人脸对齐代码实现

1. 前言

在做人脸识别的时候,前期的数据处理过程通常会遇到一个问题,需要将各种人脸从不同尺寸的图像中截取出来,再进行人脸对齐操作:即将人脸截取出来并将倾斜的人脸处理成正常的姿态。这样可以使每一个截取的人脸中的眼睛等位置处于同一位置,会对后面的识别算法起到一定的优化作用。
比如,下面3张图片所示,人脸的位置、图像的大小各不一样。我们需要做的就是将人脸从各个图片中截取出来,再进行旋转校正,使得眼睛在同一水平位置上,最后将人脸区域的图片大小也统一调整为224x 224。
人脸对齐前照片:
在这里插入图片描述
人脸对齐后照片:
在这里插入图片描述

2. 人脸对齐基本原理与步骤

人脸对齐主要包括以下几个步骤:
1,提取出每张图片里眼睛的坐标,进行读取数据
2,找两眼间的直线距离并计算该直线与水平线之间的夹角,即倾斜角度3,根据找到的倾斜角度旋转图片
4,在旋转后的图片中找到眼睛的位置
5,根据眼睛坐标找到包含面部的框的宽度和高度,调整图片的尺寸

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 人脸对齐代码实现

我们可以根据以上步骤去实现人脸对齐,但是过程可能较为复杂。此处我们使用更为简便的一种方法进行实现。
imutils库中集成了一个人脸对齐的类FaceAligner,我们直接使用它进行进行人脸对齐处理,代码如下:

# coding:utf-8
#人脸对齐:利用dlib的模型可以识别出图片中的人脸,为方便后续处理,片中的人脸截取出来并将倾斜的人脸处理成正常的姿态。
#imutils库中集成了一个人脸对齐的类FaceAligner,我们直接使用它进行处理。
from imutils.face_utils import FaceAligner
from imutils.face_utils import rect_to_bb
import imutils
import dlib
import cv2# initialize dlib 's face detector (HOG-based) and then create
# the facial landmark predictor and the face aligner
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
fa = FaceAligner(predictor, desiredFaceWidth=256)
# load the input image,resize it, and convert it to grayscale
image = cv2.imread('2.jpg')
image = imutils.resize(image, width=800)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# show the original input image and detect faces in the grayscale#image
cv2.imshow( "Input", image)
#返回人脸,(灰度图,采样次数)
rects = detector(gray,2)
#loop over the face detections
for rect in rects :# extract the ROI of the *original* face, then align the face# using facial landmarks(x, y, w, h) = rect_to_bb(rect)faceOrig = imutils.resize(image[y:y + h, x: x + w], width = 256)faceAligned = fa.align(image, gray, rect)# display the output imagescv2.imshow("Original", faceOrig)cv2.imshow("Aligned", faceAligned)cv2.waitKey(0)

在这里插入图片描述

可以看到,人脸对齐后可以将倾斜状态的人脸,很好的变为竖直状态的人脸,效果还是很好的。

如果文章对你有帮助,感谢点赞+关注!

欢迎关注下方GZH:阿旭算法与机器学习,共同学习交流~

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

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

相关文章

76、基于STM32单片机车牌识别摄像头图像处理扫描设计(程序+原理图+PCB源文件+相关资料+参考PPT+元器件清单等)

单片机主芯片选择方案 方案一:AT89C51是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元&a…

使用Streamlit和Matplotlib创建交互式折线图

大家好,本文将介绍使用Streamlit和Matplotlib创建一个用户友好的数据可视化Web应用程序。该应用程序允许上传CSV文件,并为任何选定列生成折线图。 构建Streamlit应用程序 在本文中,我们将指导完成创建此应用程序的步骤。无论你是专家还是刚刚…

CTF安全竞赛介绍

目录 一、赛事简介 二、CTF方向简介 1.Web(Web安全) (1)简介 (2)涉及主要知识 2.MISC(安全杂项) (1)介绍 (2)涉及主要知识 3…

设计模式之行为型模式

本文已收录于专栏 《设计模式》 目录 概念说明大话设计模式行为型模式 各模式详解第一组观察者模式(Observer Pattern)模板方法模式(Template Method Pattern)命令模式(Command Pattern)状态模式&#xff0…

智能指针+拷贝构造+vector容器+多态引起的bug

今天在调试一段代码的时候,VC编译提示: error C2280: “T485CommCtrlPara::T485CommCtrlPara(const T485CommCtrlPara &)”: 尝试引用已删除的函数 函数执行部分如下: 看意思是这个pComm485Pro已经消亡了,后续push_back到ve…

【Linux】MHA高可用配置及故障切换

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 MHA高可用配置及故障切换 MHA高可用配置及故障切换MHA概述MHA 的组成MHA 的特点 搭建 MySQL MHA1.Master、Slave1、Slave2 节点上安装 mysql5.72.修改…

Web项目思路

登录注册 账号密码登录,注册时生成唯一id。 找回密码 通过验证邮箱来修改现在的密码。 主页 显示最受欢迎的博主,点赞次数最多的博客,根据用户收藏夹中的偏好推荐博客等 遍历数据库,找到粉丝数最多的博主和点赞次数最多的博客…

配置本地的application-dev.yml读取nacos上面的配置

我想配置本地的application-dev.yml读取nacos上面的配置,我应该在配置文件里怎么写?并且在nacos里怎么建立 在本地的application-dev.yml文件中,您可以使用Spring Cloud Nacos来读取Nacos上的配置。以下是在配置文件和Nacos中设置的步骤&…

火爆全网,Jenkins创建容器-Python自动化测试环境搭建(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 下载 Jenkins 镜像…

【Spring】Spring框架介绍,功能模块,容器知识和有关Spring的生态圈的详细讲解

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

Java垃圾搜集算法和垃圾回收算法

垃圾回收主要针对的是JVM的堆内存,分为新生代和老年代。 按照以前的叫法,还有一个永久代,它在方法区里保存了class信息、静态变量、常量池等。 从jdk-1.8开始,方法区的实现发生了一些变化,取消了永久代的概念&#xff…

RabbitMQ管理界面介绍

1.管理界面概览 connections: 无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费,在这里可以查看连接情况 channels: 通道,建立连接后,会形成通道,消息的投递获取依…