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

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

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)

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

目录
打赏
0
0
0
0
127
分享
相关文章
基于OpenCV的车牌识别系统源码分享
基于OpenCV的车牌识别系统主要利用图像边缘和车牌颜色定位车牌,再利用OpenCV的SVM识别具体字符,从而达到车牌识别的效果。
112 4
基于OpenCV的车牌识别系统源码分享
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
148 3
Opencv学习笔记(八):如何通过cv2读取视频和摄像头来进行人脸检测(jetson nano)
如何使用OpenCV库通过cv2模块读取视频和摄像头进行人脸检测,并提供了相应的代码示例。
246 1
Ubuntu系统下编译OpenCV4.8源码
通过上述步骤,你可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使你能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
92 43
Ubuntu系统下编译OpenCV4.8源码
通过上述步骤,你可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使你能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
92 30
使用 OpenCV 和 Python 轻松实现人脸检测
本文介绍如何使用OpenCV和Python实现人脸检测。首先,确保安装了OpenCV库并加载预训练的Haar特征模型。接着,通过读取图像或视频帧,将其转换为灰度图并使用`detectMultiScale`方法进行人脸检测。检测到的人脸用矩形框标出并显示。优化方法包括调整参数、多尺度检测及使用更先进模型。人脸检测是计算机视觉的基础技术,具有广泛应用前景。
93 10
Ubuntu系统下编译OpenCV4.8源码
通过上述步骤,你可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使你能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
45 12
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
本文是关于在Jetson AGX Xavier上编译FFmpeg(3.4.1)和OpenCV(3.4.0)的详细教程,包括编译需求、步骤、测试和可能遇到的问题及其解决方案。还提供了Jetson AGX Xavier编译CUDA版本的OpenCV 4.5.0的相关信息。
194 4
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
375 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
本文介绍了如何使用OpenCV进行特定区域的目标检测,包括人脸检测实例,展示了两种实现方法和相应的代码。
160 1
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等