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

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

相关推荐
jikemaoshiyanshi6 分钟前
企业如何借助一体化 AI 工作台赋能办公提效?Amazon Quick 可适配哪些企业业务场景?—— 从智能问答、数据解析到流程自动化的全域 AI 能力平台
人工智能
IT_陈寒13 分钟前
Redis的DEL命令竟然没删掉数据?我踩的这个坑你得知道
前端·人工智能·后端
阿里云大数据AI技术1 小时前
Daft 多模态视频抽帧性能优化实践:从抽帧到大模型打标,一条视频理解流水线是怎么跑起来的
大数据·人工智能·spark
weixin_446260851 小时前
Wyvern:生成可溯源多模态报告的智能体框架
人工智能
笨鸟先飞,勤能补拙1 小时前
从预测到决策:人工智能与机器学习的系统方法、工程闭环与现实边界
大数据·人工智能·windows·python·机器学习·密码学
tech讯息1 小时前
生成式 AI 从 POC 验证迈向正式生产,推理部署环节成为卡点的核心原因是什么?
大数据·人工智能
Aethir1 小时前
第三章 — 成本与经济模型
大数据·人工智能
燕云少君1 小时前
你只是跟AI聊聊天,它已经准备好刷你的卡了
人工智能·chatgpt·openai
Java学术趴1 小时前
我把一上午的表格活,拆成了 TRAE Work 的四步
人工智能
hyuk的AI工坊2 小时前
从 Demo 到生产:LangChain4j 工程化落地全指南
人工智能