以下是详细讲解“python3利用Dlib19.7实现人脸68个特征点标定”的完整攻略。
概述
Dlib是一个现代的C++工具包,开发人员可以使用它来编写使用机器学习算法的软件。Dlib还包含了很多用于处理图像、数据等的工具。
其中,Dlib的人脸68个特征点标定是很受欢迎的功能之一,可以实现人脸检测、跟踪、姿态估计等应用。本文将介绍如何使用Python3和Dlib库实现人脸68个特征点标定。
环境配置
在开始之前,我们需要配置好Python3和Dlib库的环境。
- 安装Python3
如果你还没有安装Python3,请先从官网下载安装:https://www.python.org/downloads/
- 安装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键退出。