计算机视觉(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 显示结果

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

相关推荐
kalvin_y_liu11 分钟前
Lumi 具神智能机器人 SDK说明和ACT算法中的学习与推理
人工智能·ai·ros
阿里云大数据AI技术11 分钟前
云栖实录 | 阿里云助力金山办公打造智能搜索新标杆:WPS云文档搜索技术全面升级
人工智能·elasticsearch·搜索引擎
koo36430 分钟前
李宏毅机器学习笔记33
人工智能·笔记·机器学习
天天进步201533 分钟前
Python全栈项目--基于计算机视觉的车牌识别系统
开发语言·python·计算机视觉
学技术的大胜嗷37 分钟前
图像归一化:OpenCV 高效映射 [0,255] → [-1,1] 性能实测
图像处理·opencv·计算机视觉
无风听海40 分钟前
神经网络之密集的词向量如何能够代表稀疏的词向量
人工智能·神经网络·机器学习
文火冰糖的硅基工坊1 小时前
[人工智能-大模型-74]:模型层技术 - 模型训练六大步:③神经网络,预测输出:基本功能与对应的基本组成函数
人工智能·深度学习·神经网络
mwq301231 小时前
RLHF-奖励模型RM 的“引擎”:Pairwise Loss 梯度计算详解
人工智能
亚远景aspice1 小时前
亚远景热烈祝贺保隆科技通过ASPICE CL2评估
大数据·人工智能·物联网
苍何1 小时前
这款国产智能编码工具,竟然登顶全球TOP3!
人工智能