广告
返回顶部
首页 > 资讯 > 后端开发 > Python >OpenCV+Python怎样实现人脸对齐
  • 450
分享到

OpenCV+Python怎样实现人脸对齐

2023-06-22 01:06:34 450人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

本篇文章为大家展示了OpenCV+python怎样实现人脸对齐,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言目的是演示如何使用 OpenCV、Python 和面部标志对齐人脸。给定一组面部标志(

本篇文章为大家展示了OpenCV+python怎样实现人脸对齐,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

前言

目的是演示如何使用 OpenCV、Python 和面部标志对齐人脸。

给定一组面部标志(输入坐标),我们的目标是将图像扭曲并转换为输出坐标空间。

在这个输出坐标空间中,整个数据集中的所有面都应该:

  • 在图像中居中。

  • 旋转,使眼睛位于水平线上(即,旋转面部,使眼睛位于相同的 y 坐标上)。

  • 进行缩放,使面的大小大致相同。

为此,我们将首先调用一个实现的 Python 类FaceAligner ,以使用仿射变换对齐人脸。

注意:仿射变换用于旋转、缩放、平移等。我们可以将上述所有三个要求打包到一个 cv2.warpAffine 调用中; 诀窍是创建旋转矩阵 M 。

然后,我们将创建一个示例驱动程序 Python 脚本来接受输入图像、检测人脸并对齐它们。

最后,我们将回顾我们使用 OpenCV 过程进行人脸对齐的结果。

实现面部矫正器

面部对齐算法本身基于 Mastering OpenCV with Practical Computer Vision Projects (Baggio, 2012) 的第 8 章,如果您有 c++ 背景或兴趣,我强烈推荐它。 本书在 GitHub 上提供了开放访问的代码示例。

新建facealigner.py实现FaceAligner类。

# import the necessary packagesfrom imutils.face_utils.helpers import FACIAL_LANDMARKS_68_IDXSfrom imutils.face_utils.helpers import FACIAL_LANDMARKS_5_IDXSfrom imutils.face_utils.helpers import shape_to_npimport numpy as npimport cv2class 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 。

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

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

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

OpenCV+Python怎样实现人脸对齐

接下来是角度计算:

# 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 ,即左右眼之间的中点。 这将用于我们的旋转矩阵计算。 本质上,这个中点位于鼻子的顶部,是我们将面部旋转的点:

OpenCV+Python怎样实现人脸对齐

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

cv2.getRotationMatrix2D 的参数说明如下:

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

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

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

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

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

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

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

然后应用仿射变换来对齐人脸:

# apply the affine transformation        (w, h) = (self.desiredFaceWidth, self.desiredFaceHeight)        output = cv2.warpAffine(image, M, (w, h),            flags=cv2.INTER_CUBIC)        # return the aligned face        return output

为方便起见,将 desiredFaceWidth 和 desiredFaceHeight 分别存储到 w 和 h 中(第 70 行)。

然后调用 cv2.warpAffine 执行最后一步。 此函数调用需要 3 个参数和 1 个可选参数:

  • image : 人脸图像。

  • M :平移、旋转和缩放矩阵。

  • (w, h) :输出面所需的宽度和高度。

  • flags :用于扭曲的插值算法,在本例中为 INTER_CUBIC 。 要了解其他可能的标志和图像转换,请参阅 OpenCV 文档。

最后,对齐的脸面。

对齐人脸

开始编写人脸对齐脚本,将其命名为Now let's put this alignment class to work with a simple driver script. Open up a new file, name it align_faces.py:

# import the necessary packagesfrom imutils.face_utils import FaceAlignerfrom imutils.face_utils import rect_to_bbimport argparseimport imutilsimport dlibimport cv2# construct the argument parser and parse the argumentsap = argparse.ArgumentParser()ap.add_argument("-p", "--shape-predictor", required=True,help="path to facial landmark predictor")ap.add_argument("-i", "--image", required=True,help="path to input image")args = vars(ap.parse_args())

如果您的系统上没有安装 imutils 和/或 dlib,请确保通过 pip 安装/升级它们:

pip install --upgrade imutilspip install --upgrade dlib

win10安装dlib参考:如何安装dlib gpu版本

# initialize dlib's face detector (HOG-based) and then create# the facial landmark predictor and the face alignerdetector = dlib.get_frontal_face_detector()predictor = dlib.shape_predictor(args["shape_predictor"])fa = FaceAligner(predictor, desiredFaceWidth=256)

使用 dlib 的 get_frontal_face_detector 初始化我们的检测器对象。

使用 --shape-predictor 来实例化我们的面部标志预测器,这是 dlib 的预训练预测器的路径。

通过在第 21 行初始化一个对象 fa 来利用刚刚在上一节中构建的 FaceAligner 类。我们指定了 256 像素的人脸宽度。

接下来,加载图像并为人脸检测做准备:

# load the input image, resize it, and convert it to grayscaleimage = cv2.imread(args["image"])image = imutils.resize(image, width=800)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# show the original input image and detect faces in the grayscale# imagecv2.imshow("Input", image)rects = detector(gray, 2)

加载由命令行参数 --image 指定的图像。 调整图像的大小,保持第 25 行的纵横比,使其宽度为 800 像素。 然后将图像转换为灰度。

处理输入图像中的人脸检测,我们在其中应用了 dlib 的人脸检测器。 此函数返回 rects ,这是我们检测器发现的人脸周围的边界框列表。

在下一个块中,我们遍历 rects ,对齐每个人脸,并显示原始和对齐的图像。

# loop over the face detectionsfor 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)

开始循环。

对于 dlib 预测的每个边界框 rect,我们将其转换为格式 (x, y, w, h)。

随后,将框的大小调整为 256 像素的宽度,保持纵横比。将这个原始但调整大小的图像存储为 faceOrig 。

对齐图像,指定图像、灰度图像和矩形。

最后,将原始和对应的对齐人脸图像显示到各自窗口的屏幕上。

在显示下一个原始/对齐图像对之前,等待用户在任一窗口处于焦点时按下一个键。

对所有检测到的人脸重复上面的过程,然后脚本退出。

展示结果

输入命令:

python align_faces.py --shape-predictor shape_predictor_68_face_landmarks.dat --image 11.jpg

OpenCV+Python怎样实现人脸对齐

OpenCV+Python怎样实现人脸对齐

上述内容就是OpenCV+Python怎样实现人脸对齐,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网Python频道。

--结束END--

本文标题: OpenCV+Python怎样实现人脸对齐

本文链接: https://www.lsjlt.com/news/301777.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • OpenCV+Python怎样实现人脸对齐
    本篇文章为大家展示了OpenCV+Python怎样实现人脸对齐,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言目的是演示如何使用 OpenCV、Python 和面部标志对齐人脸。给定一组面部标志(...
    99+
    2023-06-22
  • 人脸检测实战终极之OpenCV+Python实现人脸对齐
    目录前言实现面部矫正器导入必要的包对齐人脸展示结果前言 这篇博文的目的是演示如何使用 OpenCV、Python 和面部标志对齐人脸。 给定一组面部标志(输入坐标),我们的目标是将图...
    99+
    2022-11-12
  • Opencv+SVM怎样实现人脸识别
    Opencv+SVM怎样实现人脸识别,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言如何使用 OpenCV 进行人脸识别。第一,将首先执行人脸检测,使用深度学习从每个人脸...
    99+
    2023-06-22
  • Python+Opencv怎么实现人脸追踪
    这篇文章主要介绍“Python+Opencv怎么实现人脸追踪”,在日常操作中,相信很多人在Python+Opencv怎么实现人脸追踪问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python+Opencv怎么...
    99+
    2023-06-21
  • OpenCV-Python实现人脸磨皮算法
    人脸磨皮是最基础的人脸美颜效果。主要分为祛斑,祛痘,淡化黑眼圈等步骤。通过前面的学习相信大家一眼都看得出来我们需要干什么才能识别人脸磨皮效果。 因为磨皮之后,脸部的杂质基本上就没有了...
    99+
    2022-11-12
  • Python中基于Opencv怎么实现人脸识别
    这篇文章主要讲解了“Python中基于Opencv怎么实现人脸识别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中基于Opencv怎么实现人脸识别”吧!检测人脸。这应该是最基本的...
    99+
    2023-06-02
  • python opencv怎么实现人脸识别考勤系统
    小编给大家分享一下python opencv怎么实现人脸识别考勤系统,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python可以做什么Python是一种编程语言...
    99+
    2023-06-14
  • python基于Opencv实现人脸口罩检测
    一、开发环境 python 3.6.6 opencv-python 4.5.1 二、设计要求 1、使用opencv-python对人脸口罩进行检测 三、设计原理 设计流程图如图3-1...
    99+
    2022-11-12
  • OpenCV-Python如何实现人脸磨皮算法
    这篇文章将为大家详细讲解有关OpenCV-Python如何实现人脸磨皮算法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。人脸磨皮是最基础的人脸美颜效果。主要分为祛斑,祛痘,淡化黑眼圈等步骤。通过前面的学习...
    99+
    2023-06-15
  • OpenCV-Python如何实现人脸美白算法
    这篇文章主要介绍了OpenCV-Python如何实现人脸美白算法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。人脸美白原理人脸美白原理说透了,就是一种图像的颜色空间处理,所以...
    99+
    2023-06-15
  • OpenCV-Python实现人脸美白算法的实例
    人脸美白原理 人脸美白原理说透了,就是一种图像的颜色空间处理,所以我们需要通过颜色空间进行设计。 不过,我们先来参考以下PS对于图像美白的处理步骤: 首先,新建一个图层,将...
    99+
    2022-11-12
  • python使用mediapiple+opencv识别视频人脸的实现
    目录1、安装2、代码实现3、更新 mediapiple+threadpool+opencv实现图片人脸采集效率高于dlib1、安装 pip install mediapipe 2、代...
    99+
    2022-11-13
  • python+opencv实现的简单人脸识别代码示例
    # 源码如下: #!/usr/bin/env python #coding=utf-8 import os from PIL import Image, ImageDraw import cv def...
    99+
    2022-06-04
    示例 代码 简单
  • OpenCV+FFmpeg 实现人脸检测Rtmp直播推流(Python快速实现)
    实现效果 windows平台笔记本摄像头视频采集、人脸识别,识别后将视频推流到RTMP流媒体服务器,在任意客户端可以进行RTMP拉流播放。 效果如图: 使用VLC播放器进行拉流。 准备工作 需要先安...
    99+
    2023-08-31
    ffmpeg python opencv
  • 怎么用Python+OpenCV实现猫脸检测
    这篇文章主要介绍了怎么用Python+OpenCV实现猫脸检测的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Python+OpenCV实现猫脸检测文章都会有所收获,下面我们一起来看看吧。开发工具Pytho...
    99+
    2023-06-27
  • Python基于opencv实现的人脸识别(适合初学者)
    目录一点背景知识一、人脸识别步骤 二、直接上代码(1)录入人脸.py(2)数据训练.py(3)进行识别.py三、运行过程及结果1、获取人脸照片于目标文件中2、进行数据训练,...
    99+
    2022-11-13
  • Python+OpenCV人脸识别签到考勤系统实现(附demo)
    目录前言项目效果图项目需要的环境编译器代码部分后记项目下载前言 本项目为IOT实验室人员签到考勤设计,系统实现功能:1.人员人脸识别并完成签到/签退2.考勤时间计算3.保存考勤数据为...
    99+
    2022-11-12
  • Java和OpenCV怎么实现图片中的人脸识别
    要在Java中实现人脸识别,可以使用OpenCV库。以下是一个基本的示例代码:```javaimport org.opencv.co...
    99+
    2023-08-18
    Java OpenCV
  • 基于opencv和pillow怎么实现人脸识别系统
    这篇文章主要讲解了“基于opencv和pillow怎么实现人脸识别系统”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于opencv和pillow怎么实现人脸识别系统”吧!本文不涉及分类器、...
    99+
    2023-06-21
  • 怎样使用Python实现简单的人脸识别功能
    这篇文章给大家分享的是有关怎样使用Python实现简单的人脸识别功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、首先梳理一下实现人脸识别需要进行的步骤:流程大致如此,在此之前,要先让人脸被准确的找出来,也就...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作