基于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)

在这里插入图片描述

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

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

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

  • 10
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿_旭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值