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

news2024/12/24 21:18:00

目录

  • 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 images
    cv2.imshow("Original", faceOrig)
    cv2.imshow("Aligned", faceAligned)
    cv2.waitKey(0)

在这里插入图片描述

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

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

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

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

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

相关文章

JVM-java对象内存分布(二)

目录 一、栈针 二、java 对象内存分布 1、那何为java内存对象布局? 2、什么是jvm的内存模型 1、如果我们新生代,一直创建新对象,此时我们新生代不够用了怎么办? 2、那么为什么大部分对象的生命周期比较短呢?这个…

HCIP-7.3QinQ技术原理、配置链路聚合Eth-Trunk

HCIP-7.3QinQ技术原理、配置&链路聚合Eth-Trunk 1、QinQ概述1.1、QinQ实现方式:1.2、QinQ封装结构:1.3、QinQ的分类:1.3.1、基于端口的QinQ1.3.2、灵活QinQ 2、链路聚合Eth-Trunk2.1、Eth-Trunk基本原理2.2、手工聚合模式2.2.1、配置接口…

集团公司该如何构建信息化系统?

干货文章,全文手码,花3分钟认真看完,绝对有收获! 前言: 信息化系统是管理体系的延伸,如果一家集团企业想要走向信息化,首先得考虑的是,企业内当前是否已经存在完备的信息化管理制度…

《面试1v1》SpringMVC

🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结&#xf…

【电子取证篇】电子数据取证标准(国家标准GB/T)

【电子取证篇】电子数据取证标准(国家标准GB/T) ​ 电子数据取证国家标准,此次更新把名称由"电子物证"更改成了"电子数据",避免了不同部门不同行业因为不同叫法而辩论个不停,后续标准的更新应该会…

JUC高级-0624

10. ThreadLocal(线程局部变量) 10.1 ThreadLocal基础 大厂面试题 ThreadLocal中 ThreadLocalMap的数据结构和关系?ThreadLocal的key是弱引用,这是为什么?ThreadLocal内存泄露问题你知道吗?ThreadLocal中…

clickhouse初探

背景 目前公司用的是influxdb来存储时序数据,但是influxdb太坑了,查一天的数据就开始内存猛涨,然后就炸了,查询语句也不适应。因此调研了tdengine,还把influxdb和tdengine做了性能对比。 结果嘛 ,首先tden…

C语言:位操作----将某一位置1或置0

C语言 基础开发----目录 前期准备 想要将将某一位置1或置0&#xff0c;需要进行位操作。 此次需要用到 与(&)&#xff0c;或(|)&#xff0c;左移(<<)和右移(>>) 这四个位操作。 具体位操作说明&#xff1a;C语言&#xff1a;位运算符----与(&)&#xff…

5年资深Android开发,转行逆向开发该如何学习?

Android逆向是什么&#xff1f; 简单地来说&#xff0c;安卓逆向是对已经打包好的APP进行反编译、源码分析了解APP实现逻辑的一门技术。我们可以把安卓安装时用到的APK文件看作一个加密后的压缩包&#xff0c;逆向就是要最大程序地还原出APK打包之前的源码。 逆向需要用到解密…

[Web程序设计]实验: Web基础

一、实验目的 &#xff08;1&#xff09;掌握开发工具的安装和配置 &#xff08;2&#xff09;熟悉程序的编写&#xff0c;运行和访问方法&#xff1b; 二、实验内容 &#xff08;1&#xff09;请编写出一个HTML页面&#xff0c;令其输出“hello world!~~”&#xff0c;使用…

略施小计,拥有自己的GPT

ChatGPT一经发布就在AI圈引起轰动&#xff0c;GPT-4和chagpt-plugin让OpenAI和其他同行拉开了更大的差距。由于某些原因&#xff0c;我们可能无法亲身体验ChatGPT的神奇之处。但现在&#xff0c;如果你还没有体验过ChatGPT&#xff0c;就像10年前没有购买比特币一样&#xff08…

SuperMap GIS基础产品WebGIS FAQ集锦(3)

SuperMap GIS基础产品WebGIS FAQ集锦&#xff08;3&#xff09; 【iClient】iClient for Leaflet,如何修改map的默认渲染方式&#xff1f; 【解决办法】map的默认渲染方式取决于浏览器支持&#xff0c;可通过renderer属性设置&#xff0c;设置为L.SVG或L.Canvas 【iClient】le…

k8s 学习九,pod 知识点 上

在 K8S 中&#xff0c; pod 是一个非常关键的存在&#xff0c;我们一起来看看 pod 具体是个什么&#xff1f; pod 是个啥&#xff1f; pod 是个什么呢&#xff1f;pod 是 K8S中的一个核心概念 每一个 pod 都会有一个特殊的根容器&#xff0c;叫做 pause 容器&#xff0c;paus…

云原生:深入掌握Docker日志管理:高效策略与最佳实践

前言 在docker的整个生命周期中&#xff0c;超过70%的时间&#xff0c;我们都是在用docker进行运维工作&#xff0c; 查看docker的日志&#xff0c;是运维中的必会技能。 docker日志分为&#xff1a; docker引擎日志应用日志 今天我们重点来讨论下docker的日志使用&#xf…

【博客672】prometheus使用数据外推与兼容跳变重置来优化处理窗口函数(rate,irate,increase)

prometheus使用数据外推与兼容跳变重置来优化处理窗口函数(rate&#xff0c;irate&#xff0c;increase) 场景 以下是用于计算计数器增长率的三个函数之间差异的高级概述&#xff1a; rate()&#xff1a;这计算每秒的增长率&#xff0c;在整个提供的时间窗口内平均。示例&am…

谷歌推出“能讲会听”的大语言模型AudioPaLM,实现语音理解和生成

出品人&#xff1a;Towhee 技术团队 作者&#xff1a;顾梦佳 近日&#xff0c;谷歌推出了一个能够理解并生成语音理解的大型语言模型——AudioPaLM。这一模型融合了分别基于文本和语音两种语言模型——PaLM-2 和 AudioLM&#xff0c;形成了一个统一的多模态架构。该模型不仅能对…

@monthly /root/.cfg/./dealer病毒清除

登录服务器时&#xff0c;ssh提示密码不对&#xff0c;就去控制台检查&#xff0c;查看到虚拟平台中多台服务器提示虚拟机CPU使用告警&#xff0c;占用过高。远程无法登录。 原因分析&#xff1a;所有中毒的均为linux服务器&#xff0c;密码设置过于简单&#xff0c;防火墙关闭…

【算法题】统计各位数字之和为偶数的整数个数、替换空格、旋转数组的最小数字

算法题之数字处理 一、统计各位数字之和为偶数的整数个数1.1、题目1.2、理解题目1.3、解题思路&#xff08;暴力枚举&#xff09;1.4、解题思路2&#xff08;数学公式&#xff09;1.5、小结 二、替换空格2.1、题目2.2、解题&#xff1a;遍历原地修改 三、旋转数组的最小数字3.1…

如何判断TongWeb是否支持某种数据库?

起因&#xff1a; 数据库连接池本是一项成熟的技术&#xff0c;但随着数据库厂家、种类的增加&#xff0c;常常被问到TongWeb是否支持XX数据库&#xff1f; 说明&#xff1a; 数据库连接池的基本思路是&#xff0c;平时建立适量的数据库的连接&#xff0c;放在一个集合中&…

举例说明,JS中的【return true】和【return false】的【使用场景】

1.return true和return false都是写在函数里面 2.如果一个函数需要有返回值&#xff0c;则函数中需要写return相关 3.return true和return false是之后调用这个函数判断用&#xff1a; 如果一个函数需要返回值&#xff0c;则需要在函数中添加return 如果函数中添加的是 比如 …