当前位置: 首页 > news >正文

计算机视觉(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 += 1face = 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 npimg = 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 += 1face = 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 显示结果

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

http://www.dtcms.com/a/423046.html

相关文章:

  • 古代游戏中的社交密码
  • (免费分享)基于python的飞机大战游戏
  • 虚幻引擎UE5专用服务器游戏开发-21 连招技能动画蒙太奇播放
  • 洛阳市建设厅网站网站优化布局
  • 20250929给PRO-RK3566开发板在Buildroot系统下裁剪内核【已关闭摄像头ov4689为例子】
  • Python 豆瓣TOP250 爬虫类讲解
  • 建一个网站迈年广电基础设施建设官方网站
  • Microsoft Access SQL 查询中的通配符
  • 服务好的高端网站建设企业网站开发一般用的什么架构
  • Trae添加mysql mcp AI编程 链接数据库
  • LeetCode 199. 二叉树的右视图
  • 做网页和网站有什么区别吗网站如何做移动适配
  • 番禺区移动端网站制作外贸公司名称大全简单大气
  • flutter实现Function Call
  • 如何给给公司建立网站毕业设计做视频网站
  • 【c++】:Pimpl 模式使用
  • 深度解析MySQL InnoDB缓冲池性能优化
  • 基于Chrome140的FB账号自动化——脚本撰写(二)
  • 机构投资者沟通指数(2011-2024)
  • isolcpusnohz_full
  • p2p网上贷款网站建设方案.docx一站式网站开发
  • 我的创作纪念日 -- aramae
  • ArcGIS Manager Server Add Host页面报错 HTTP Status 500
  • 基于STM32的智能家居控制系统 - 嵌入式开发期末项目
  • 建设网站计划书做全球视频网站赚钱吗
  • MTK调试-音频dirac
  • 台山网站建设网络架构图描述
  • [论文阅读] 人工智能 + 软件工程 | AFD——用“值流分析+LLM”破解C程序指针分析精度难题,26倍提升堆对象建模效率!
  • 一级a做爰片免费网站迅雷下载上海资格证报名网站
  • 【Linux文件映射 -- mmap基本介绍】