python3利用Dlib19.7实现人脸68个特征点标定

  • Post category:Python

以下是详细讲解“python3利用Dlib19.7实现人脸68个特征点标定”的完整攻略。

概述

Dlib是一个现代的C++工具包,开发人员可以使用它来编写使用机器学习算法的软件。Dlib还包含了很多用于处理图像、数据等的工具。

其中,Dlib的人脸68个特征点标定是很受欢迎的功能之一,可以实现人脸检测、跟踪、姿态估计等应用。本文将介绍如何使用Python3和Dlib库实现人脸68个特征点标定。

环境配置

在开始之前,我们需要配置好Python3和Dlib库的环境。

  1. 安装Python3

如果你还没有安装Python3,请先从官网下载安装:https://www.python.org/downloads/

  1. 安装Dlib库

在安装Dlib库之前,你需要安装一些必要的依赖库。在Ubuntu系统中可以通过以下命令安装:

sudo apt-get install build-essential cmake
sudo apt-get install libgtk-3-dev
sudo apt-get install libboost-all-dev

然后,就可以使用pip安装Dlib库了:

pip install dlib

人脸68个特征点标定

接下来,我们开始使用Dlib库实现人脸68个特征点标定。

首先,我们需要导入相关的Python库和Dlib库:

import cv2
import dlib

然后,我们加载训练好的人脸检测器。这里使用的是基于“HOG特征+SVM分类器”的检测器,这个检测器可以用于检测人脸位置。

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

在获取到人脸检测器和68个特征点检测器之后,我们可以加载一张图片并进行人脸检测:

img = cv2.imread("test.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = detector(gray, 1)

其中,detectMultiScale()方法返回包含人脸位置信息的矩形区域,这些矩形区域可以视为人脸的候选框(bounding box)。如果在一张图片中存在多个人脸,则返回多个矩形区域。

接下来,我们可以使用68个特征点检测器对每个人脸进行68个特征点标定:

for (i, face) in enumerate(faces):
    shape = predictor(gray, face)
    for (j, point) in enumerate(shape.parts()):
        x = point.x
        y = point.y
        cv2.circle(img, (x, y), 2, (0, 255, 0), -1)

在每个人脸的68个特征点标定完成之后,我们可以用OpenCV的circle()方法将每个特征点画出来,这里我们将它们画成绿色的小圆点。

最后,我们可以将标定好的结果保存到本地文件:

cv2.imwrite("output.jpg", img)

示例说明

下面,我们将通过两个示例说明如何使用Python3和Dlib库实现人脸68个特征点标定。

示例1:标定单张人脸图片

假设我们已经准备好一张人脸图片,并且知道它的位置。我们可以根据图片路径和人脸位置信息进行人脸68个特征点标定:

import cv2
import dlib

# 加载人脸检测器和68个特征点检测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

# 加载图片
img = cv2.imread("test.jpg")

# 将图片转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 检测人脸
face_rect = dlib.rectangle(left=100, top=100, right=300, bottom=300)
shape = predictor(gray, face_rect)

# 标定68个特征点
for (j, point) in enumerate(shape.parts()):
    x = point.x
    y = point.y
    cv2.circle(img, (x, y), 2, (0, 255, 0), -1)

# 保存结果到文件
cv2.imwrite("output.jpg", img)

这个示例中,我们手动指定了人脸位置。实际应用中,我们需要使用人脸检测器来自动检测人脸位置。

示例2:标定Webcam视频流

这个示例演示如何从Webcam视频流中实时标定人脸68个特征点。我们将使用OpenCV库读取视频流,然后在每一帧中检测人脸位置并进行特征点标定。

import cv2
import dlib

# 加载人脸检测器和68个特征点检测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

# 打开Webcam
cap = cv2.VideoCapture(0)

while(True):
    # 读取一帧
    ret, frame = cap.read()

    # 将图片转换为灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 检测人脸
    faces = detector(gray, 1)

    # 标定每个人脸的68个特征点
    for (i, face) in enumerate(faces):
        shape = predictor(gray, face)
        for (j, point) in enumerate(shape.parts()):
            x = point.x
            y = point.y
            cv2.circle(frame, (x, y), 2, (0, 255, 0), -1)

    # 显示结果
    cv2.imshow('frame',frame)

    # 按q键退出程序
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头资源
cap.release()

# 关闭窗口
cv2.destroyAllWindows()

这个示例中,我们使用OpenCV库打开摄像头,并循环读取每一帧。在每一帧中,我们使用Dlib库进行人脸检测和68个特征点标定,并使用OpenCV库将标定好的特征点显示出来。程序会一直运行,直到按下q键退出。