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


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

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

本文将通过 dlib 和 OpenCV 实现以下流程:

  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 显示结果

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

相关推荐
桃西西呀23 分钟前
我把整本接口文档塞进 system prompt,前 3 轮答得准,第 8 轮开始胡说,账单还翻了 4 倍
人工智能·llm·ai编程
天天代码码天天26 分钟前
给孩子打印一本“数字连点画”!连出小鱼、火箭,画完还能涂色
人工智能
SL_staff1 小时前
规则联动:给工厂装上‘自动化神经反射弧’——JVS·物联网平台规则引擎实战教程
java·人工智能·物联网
众壹新能源科技2 小时前
逆变器自带无功不够用,加装5MVar SVG后功率因数从0.85回到0.99
运维·人工智能·自动化
king13598745502 小时前
LFM2.5-24B-A2B Mac 本地部署:内存估算、GGUF/MLX 与 Python 预检脚本
人工智能·macos
DeeGLMath2 小时前
optimtool最新版加速训练分类任务
人工智能·分类·数据挖掘
在所不辞兄2 小时前
为什么神经网络对对抗扰动和分布偏移往往比较脆弱,而人类感知相对更鲁棒?
人工智能·深度学习·神经网络·机器学习
考拉讲支付2 小时前
母婴亲子服务平台分账架构设计:多场景多方分账与合规清结算实践
大数据·运维·人工智能·微信小程序·架构·微信公众平台
xier_ran2 小时前
【infra之路】AI 编译器学习笔记(十三):AI 编译器全景——TVM、XLA、IREE 与其他
人工智能·笔记·学习