人脸检测实战终极:使用 OpenCV 和 Python 进行人脸对齐(1)

本文介绍了如何使用OpenCV和Python进行人脸识别对齐。通过面部标志性预测器确定左眼坐标,计算眼睛之间的角度和距离,以调整图像的旋转和比例,确保脸部对齐。此外,还提供了FaceAligner类的实现,用于处理图像对齐操作。
摘要由CSDN通过智能技术生成

import the necessary packages

from imutils.face_utils.helpers import FACIAL_LANDMARKS_68_IDXS

from imutils.face_utils.helpers import FACIAL_LANDMARKS_5_IDXS

from imutils.face_utils.helpers import shape_to_np

import numpy as np

import cv2

class FaceAligner:

def init(self, predictor, desiredLeftEye=(0.35, 0.35),

desiredFaceWidth=256, desiredFaceHeight=None):

store the facial landmark predictor, desired output left

eye position, and desired output face width + height

self.predictor = predictor

self.desiredLeftEye = desiredLeftEye

self.desiredFaceWidth = desiredFaceWidth

self.desiredFaceHeight = desiredFaceHeight

if the desired face height is None, set it to be the

desired face width (normal behavior)

if self.desiredFaceHeight is None:

self.desiredFaceHeight = self.desiredFaceWidth

导入必要的包

定义的构造函数开始我们的 FaceAligner 类。

我们的构造函数有 4 个参数:

  • predictor :面部标志性预测器模型。

  • requiredLeftEye :一个可选的 (x, y) 元组,显示默认值,指定所需的输出左眼位置。对于此变量,通常会看到 20-40% 范围内的百分比。这些百分比控制对齐后人脸的可见程度。使用的确切百分比将因应用程序而异。使用 20% 时,您基本上会获得“放大”的脸部视图,而使用较大的值时,脸部会显得更“缩小”。

  • requiredFaceWidth :另一个可选参数,以像素为单位定义我们想要的人脸。我们将此值默认为 256 像素。

  • requiredFaceHeight :最后一个可选参数,以像素为单位指定我们所需的人脸高度值。

接下来,让我们决定是想要一张方形的人脸图像还是矩形的图像。检查 requiredFaceHeight 是否为 None ,如果是,我们将其设置为 desiredFaceWidth ,这意味着面部是方形的。方形图像是典型情况。或者,我们可以为 desiredFaceWidth 和 desiredFaceHeight 指定不同的值以获得感兴趣的矩形区域。

现在我们已经构建了我们的 FaceAligner 对象,接下来我们将定义一个对齐人脸的函数。

这个函数有点长,所以我把它分成了 5 个代码块,让它更容易理解:

def align(self, image, gray, rect):

convert the landmark (x, y)-coordinates to a NumPy array

shape = self.predictor(gray, rect)

shape = shape_to_np(shape)

extract the left and right eye (x, y)-coordinates

(lStart, lEnd) = FACIAL_LANDMARKS_IDXS[“left_eye”]

(rStart, rEnd) = FACIAL_LANDMARKS_IDXS[“right_eye”]

leftEyePts = shape[lStart:lEnd]

rightEyePts = shape[rStart:rEnd]

定义了 align 函数,它接受三个参数:

  • image : RGB 输入图像。

  • gray :灰度输入图像。

rect :由 dlib 的 HOG 人脸检测器生成的边界框矩形。

应用 dlib 的面部标志预测器并将标志转换为 NumPy 格式的 (x, y) 坐标。

接下来,从 helpers.py 脚本中找到的 FACIAL_LANDMARK_IDXS 字典中读取 left_eye 和 right_eye 区域。 这些 2 元组值存储在左/右眼开始和结束索引中。

提取leftEyePts 和 rightEyePts 。

接下来,计算每只眼睛的中心以及眼睛质心之间的角度。

这个角度是对齐我们的图像的关键组成部分。

眼睛之间的绿线夹角,如下图所示,是我们比较关心的。

image-20211212213556697

接下来是角度计算:

compute the center of mass for each eye

leftEyeCenter = leftEyePts.mean(axis=0).astype(“int”)

rightEyeCenter = rightEyePts.mean(axis=0).astype(“int”)

compute the angle between the eye centroids

dY = rightEyeCenter[1] - leftEyeCenter[1]

dX = rightEyeCenter[0] - leftEyeCenter[0]

angle = np.degrees(np.arctan2(dY, dX)) - 180

分别通过平均每只眼睛的所有 (x, y) 点来计算每只眼睛的质心,也称为质心。

给定眼睛中心,我们可以计算 (x, y) 坐标的差异并取反正切以获得眼睛之间的旋转角度。

这个角度将允许我们校正旋转。

为了确定角度,我们首先计算 y 方向的增量 dY 。 这是通过在第 38 行找到 rightEyeCenter 和 leftEyeCenter 之间的差异来完成的。

类似地,我们计算 dX ,即第 39 行 x 方向的增量。

接下来,我们计算面部旋转的角度。 我们使用带有参数 dY 和 dX 的 NumPy 的 arctan2 函数,然后转换为度数,同时减去 180 以获得角度。

在以下代码块中,我们计算所需的右眼坐标(作为左眼位置的函数)并计算新结果图像的比例。

compute the desired right eye x-coordinate based on the

desired x-coordinate of the left eye

desiredRightEyeX = 1.0 - self.desiredLeftEye[0]

determine the scale of the new resulting image by taking

the ratio of the distance between eyes in the current

image to the ratio of distance between eyes in the

desired image

dist = np.sqrt((dX ** 2) + (dY ** 2))

desiredDist = (desiredRightEyeX - self.desiredLeftEye[0])

desiredDist *= self.desiredFaceWidth

scale = desiredDist / dist

根据所需的左眼 x 坐标计算所需的右眼。从 1.0 中减去 self.desiredLeftEye[0] 因为所需的RightEyeX 值应该与图像的右边缘等距,因为相应的左眼 x 坐标与其左边缘的距离相同。

然后可以通过获取当前图像中眼睛之间的距离与所需图像中眼睛之间的距离的比率来确定人脸的比例

首先,计算欧几里得距离比 dist 。

接下来,使用左右眼 x 值之间的差异,计算所需的距离,desiredDist。

通过在第 52 行乘以所需的面宽来更新所需的距离。这实质上是根据所需的宽度缩放的眼睛距离。

最后,比例是通过将 desiredDist 除以我们之前计算的 dist 来计算的。

现在有了旋转角度和比例,需要在计算仿射变换之前采取一些步骤。这包括找到眼睛之间的中点以及计算旋转矩阵并更新其平移分量:

compute center (x, y)-coordinates (i.e., the median point)

between the two eyes in the input image

eyesCenter = (int((leftEyeCenter[0] + rightEyeCenter[0]) // 2),

int((leftEyeCenter[1] + rightEyeCenter[1]) // 2))

grab the rotation matrix for rotating and scaling the face

M = cv2.getRotationMatrix2D(eyesCenter, angle, scale)

update the translation component of the matrix

tX = self.desiredFaceWidth * 0.5

tY = self.desiredFaceHeight * self.desiredLeftEye[1]

M[0, 2] += (tX - eyesCenter[0])

M[1, 2] += (tY - eyesCenter[1])

计算 eyeCenter ,即左右眼之间的中点。 这将用于我们的旋转矩阵计算。 本质上,这个中点位于鼻子的顶部,是我们将面部旋转的点:

image-20211212214237870

为了计算旋转矩阵 M ,我们使用 cv2.getRotationMatrix2D 指定 eyeCenter 、角度和比例。这三个值中的每一个都先前已计算过,因此请根据需要返回。

cv2.getRotationMatrix2D 的参数说明如下:

  • eyeCenter :眼睛之间的中点是我们将围绕面部旋转的点。

  • angle:我们将面部旋转到的角度,以确保眼睛位于同一水平线上。

  • scale :我们将放大或缩小图像的百分比,确保图像缩放到所需的大小。

现在必须更新矩阵的平移分量,使人脸在仿射变换后仍然在图像中。

取所需面宽的一半并将值存储为 tX,即 x 方向的平移。

为了计算 tY ,y 方向的平移,将所需的面部高度乘以所需的左眼 y 值,desiredLeftEye[1]。

使用 tX 和 tY ,通过从它们对应的眼睛中点值(第 66 行和第 67 行)中减去每个值来更新矩阵的平移分量。

文末有福利领取哦~

👉一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。img

👉二、Python必备开发工具

img
👉三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
img

👉 四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
img

👉五、Python练习题

检查学习结果。
img

👉六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
img

img

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python爬虫全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:python)
img

上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

深知大多数初中级Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python爬虫全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:python)
[外链图片转存中…(img-M23LW99I-1711004483839)]

使用OpenCV(Open Source Computer Vision Library)和Python,可以实现基于Haar级联分类器或深度学习模型的人脸识别功能。这里简述一下基本步骤: 1. **安装依赖**: 首先,确保已安装`numpy`, `matplotlib`以及OpenCV库。可以使用pip安装: ``` pip install numpy matplotlib opencv-python opencv-python-headless ``` 2. **人脸检测**: OpenCV提供预训练的人脸检测器如Haar级联分类器(`cv2.CascadeClassifier`)。加载预训练数据,并对图片应用它: ```python import cv2 face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') img = cv2.imread('image1.jpg') # 替换为你的图片路径 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5) ``` 3. **人脸区域提取**: 对于每个检测到的人脸,你可以通过矩形框标记出来: ```python for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) ``` 4. **人脸识别**(如果是基于特征点的方法,例如HOG+SVM): - 提取人脸特征(例如眼睛、鼻子等关键点) - 训练一个小的分类器(如果你有对应的标签) 5. **深度学习方法(如FaceNet, Dlib's Face Recognition API等)**: - 如果使用深度学习,需要先进行人脸对齐和编码。比如使用Dlib的面部关键点或者MTCNN等库。 - 对新的人脸图像做同样的预处理,然后将编码与数据库中的编码进行比对。 6. **结果显示**: 显示处理后的图片。 ```python cv2.imshow("Detected Faces", img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 注意:这只是一个基础示例,实际项目中可能还需要考虑性能优化、错误处理和多人脸情况下的处理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值