计算机视觉(opencv)——基于 dlib 人脸对齐


使用 dlib 实现人脸检测、关键点定位与人脸对齐(倾斜校正)

在计算机视觉中,人脸检测人脸对齐 是人脸识别和表情分析等任务的前置步骤。

本文将通过 dlibOpenCV 实现以下流程:

  1. 读取一张人脸图片

  2. 检测图片中的所有人脸框

  3. 通过人脸关键点预测器获取 68 个关键点

  4. 使用 dlib.get_face_chips 对人脸进行对齐(倾斜校正)

  5. 将结果逐个显示

我们先来看完整代码,然后逐行解析。


完整代码

复制代码
import cv2
import dlib
import numpy as np

# 读取输入图片
img = cv2.imread("face.jpg")

# 步骤1:构造人脸检测器
detector = dlib.get_frontal_face_detector()

# 使用人脸检测器检测人脸,返回人脸矩形框
faceBoxs = detector(img, 1)

# 加载68点人脸关键点预测模型
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

# 步骤2:将检测到的人脸框逐个放入容器faces
faces = dlib.full_object_detections()   # 构造容器
for faceBox in faceBoxs:
    faces.append(predictor(img, faceBox))  # 将每个人脸的关键点预测结果放入容器

# 步骤3:根据人脸关键点对齐人脸
faces = dlib.get_face_chips(img, faces, size=120)

# 步骤4:将每一张对齐后的人脸显示出来
n = 0  # 用变量n给人脸编号
for face in faces:
    n += 1
    face = np.array(face).astype(np.uint8)  # 转换为OpenCV能显示的uint8格式
    cv2.imshow('face%s' % n, face)

# 显示原始图像
cv2.imshow("original", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码详解

1. 导入库与加载图像

复制代码
import cv2
import dlib
import numpy as np

img = cv2.imread("face.jpg")
  • cv2.imread 读取一张人脸图片。

  • 注意:如果路径不对或图片不存在,img 会是 None,要确保文件路径正确。


2. 构造人脸检测器

复制代码
detector = dlib.get_frontal_face_detector()
faceBoxs = detector(img, 1)
  • dlib.get_frontal_face_detector() 返回一个 HOG + SVM 的人脸检测器

  • detector(img, 1) 进行人脸检测:

    • 第一个参数是图片

    • 第二个参数是 图像金字塔层数1 表示放大一次,适合检测较小的人脸)

返回结果 faceBoxs 是一个列表,包含所有检测到的人脸矩形框。


3. 加载关键点预测模型并提取人脸关键点

复制代码
predictor  = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
faces = dlib.full_object_detections()
for faceBox in faceBoxs:
    faces.append(predictor(img, faceBox))
  • shape_predictor_68_face_landmarks.dat 是预训练模型,包含 68 个关键点的位置。

  • dlib.full_object_detections() 创建一个容器,用于存放每张人脸的关键点信息。

  • 循环遍历每张人脸,将关键点预测结果追加到 faces 容器中。

每张人脸会得到 68 个关键点,如下所示:

1-17 轮廓

18-27 眉毛

28-36 鼻子

37-48 眼睛

49-68 嘴巴


4. 人脸对齐(倾斜校正)

复制代码
faces = dlib.get_face_chips(img, faces, size=120)
  • dlib.get_face_chips 会根据关键点对人脸进行仿射变换,让双眼水平、嘴巴居中,得到标准对齐的人脸。

  • size=120 表示输出图像大小为 120×120。

作用:解决人脸倾斜问题,使得后续人脸识别、表情分析效果更好。


5. 显示结果

复制代码
n = 0
for face in faces:
    n += 1
    face = np.array(face).astype(np.uint8)
    cv2.imshow('face%s' % n, face)
cv2.imshow("original", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 循环遍历每张对齐后的人脸,编号并显示。

  • np.array(face).astype(np.uint8) 转换为 OpenCV 可显示的格式。

  • 还会显示原始图像,方便对比。


运行结果

运行该代码后,你会看到:

  • 一个窗口显示原始图片

  • 多个窗口显示裁剪并对齐后的人脸,每张脸单独一个窗口

效果类似下图:

(左:原始图像,右:对齐后的人脸)


扩展:实时摄像头

cap = cv2.VideoCapture(0)

while True:

ret, frame = cap.read()

if not ret:

break

faceBoxs = detector(frame, 0)

faces = dlib.full_object_detections()

for faceBox in faceBoxs:

faces.append(predictor(frame, faceBox))

chips = dlib.get_face_chips(frame, faces, size=120)

for i, chip in enumerate(chips):

chip = np.array(chip).astype(np.uint8)

cv2.imshow(f'face{i+1}', chip)

cv2.imshow("original", frame)

if cv2.waitKey(1) & 0xFF == ord('q'):

break

cap.release()

cv2.destroyAllWindows()


总结

本文用 dlib 实现了完整的人脸检测与对齐流程,主要包含以下步骤:

  1. 使用 dlib.get_frontal_face_detector() 检测人脸

  2. 使用 68 关键点预测器提取人脸关键点

  3. 调用 dlib.get_face_chips 进行人脸对齐

  4. 用 OpenCV 显示结果

人脸对齐是人脸识别前非常关键的预处理步骤,可以显著提升识别准确率。该代码也可以很容易扩展到视频流,实现实时人脸对齐。

相关推荐
pccai-vip2 小时前
系分论文《论边缘计算在工业质检系统中的分析与设计》
人工智能·边缘计算
网安INF2 小时前
【论文阅读】-《Sparse Adversarial Attack via Perturbation Factorization》
论文阅读·人工智能·计算机视觉·网络安全·黑盒攻击
Francek Chen2 小时前
【深度学习计算机视觉】10:转置卷积
人工智能·pytorch·深度学习·计算机视觉·卷积神经网络
Hy行者勇哥3 小时前
除 OpenAI/GPT-4o 等主流头部产品外,值得关注的 AI 及 Agent 产品有哪些?
人工智能
paopaokaka_luck3 小时前
基于SpringBoot+Vue的志行交通法规在线模拟考试(AI问答、WebSocket即时通讯、Echarts图形化分析、随机测评)
vue.js·人工智能·spring boot·后端·websocket·echarts
张较瘦_4 小时前
[论文阅读] AI+软件工程(DeBug)| 从11%到53%!双LLM驱动的工业级代码修复方案,Google数据集验证有效
论文阅读·人工智能·软件工程
奔跑的石头_4 小时前
GPT-5最新特性和优点
人工智能
MPCTHU4 小时前
Deep Learning|01 RBF Network
人工智能·深度学习
wa的一声哭了4 小时前
Deep Learning Optimizer | Adam、AdamW
人工智能·深度学习·神经网络·机器学习·自然语言处理·transformer·pytest