Python3利用Dlib19.7实现人脸68个特征点标定
简介
本篇攻略将介绍如何使用Python3和Dlib19.7库实现人脸68个特征点标定。Dlib是一个非常强大的机器视觉工具集,其中包含了一些实现基础人脸识别、人脸对齐和特征点检测等功能的算法。本文将使用其中的特征点检测算法,实现68个特征点的标定。首先,需要准备依赖环境。
设计思路
要实现人脸68个特征点的标定,可以分为以下几个步骤:
- 安装 Dlib19.7及其依赖包
- 下载 shape_predictor_68_face_landmarks.dat 数据文件
- 加载待检测的图片
- 使用 Dlib19.7 的人脸检测算法找到图像中的人脸
- 使用 Dlib19.7 的特征点检测算法找到每张人脸上68个关键点
- 将特征点输出到图片上,完成标定过程
详细步骤
步骤1:安装 Dlib19.7及其依赖包
在终端中使用以下命令完成 Dlib19.7 安装:
pip install dlib==19.7
需要注意的是,Dlib19.7依赖于Boost和CMake,需要先安装这些依赖库,否则会安装失败。可以使用以下命令安装:
sudo apt-get install -y build-essential cmake
sudo apt-get install -y libgtk-3-dev
sudo apt-get install -y libboost-all-dev
步骤2:下载 shape_predictor_68_face_landmarks.dat 数据文件
在进行特征点检测时,需要使用训练好的数据文件。可以在官网 http://dlib.net/files/ 找到相关资源。下载完成后,将文件放置到指定目录下即可。
步骤3:加载待检测的图片
使用 OpenCV 加载待检测的图片(需要先安装 OpenCV),如下所示:
import cv2
image = cv2.imread("test.jpg")
步骤4:使用 Dlib19.7 的人脸检测算法找到图像中的人脸
import dlib
detector = dlib.get_frontal_face_detector()
faces = detector(image)
步骤5:使用 Dlib19.7 的特征点检测算法找到每张人脸上68个关键点
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
for face in faces:
landmarks = predictor(image, face)
for n in range(68):
x = landmarks.part(n).x
y = landmarks.part(n).y
# 将检测到的特征点绘制到图片上
cv2.circle(image, (x, y), 1, (0, 0, 255), -1)
步骤6:将特征点输出到图片上,完成标定过程
cv2.imwrite("result.jpg", image)
cv2.imshow("result.jpg", image)
cv2.waitKey(0)
完整代码可能如下所示:
import cv2
import dlib
# 加载图片
image = cv2.imread("test.jpg")
# 创建人脸检测器
detector = dlib.get_frontal_face_detector()
# 在图像中找到人脸
faces = detector(image)
# 加载特征点检测器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# 对每张人脸检测68个特征点
for face in faces:
landmarks = predictor(image, face)
for n in range(68):
x = landmarks.part(n).x
y = landmarks.part(n).y
# 将检测到的特征点绘制到图片上
cv2.circle(image, (x, y), 1, (0, 0, 255), -1)
# 结果展示
cv2.imshow("result.jpg", image)
cv2.waitKey(0)
cv2.destroyWindow("result.jpg")
示例说明
示例1
假设我现在有一张人脸图片 "test.jpg",需要进行68个特征点的标定。可以使用以上步骤进行标定。此时输出的图片将会包含标注了68个特征点的人脸。
import cv2
import dlib
# 加载图片
image = cv2.imread("test.jpg")
# 创建人脸检测器
detector = dlib.get_frontal_face_detector()
# 在图像中找到人脸
faces = detector(image)
# 加载特征点检测器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# 对每张人脸检测68个特征点
for face in faces:
landmarks = predictor(image, face)
for n in range(68):
x = landmarks.part(n).x
y = landmarks.part(n).y
# 将检测到的特征点绘制到图片上
cv2.circle(image, (x, y), 1, (0, 0, 255), -1)
# 结果展示
cv2.imshow("result.jpg", image)
cv2.waitKey(0)
cv2.destroyWindow("result.jpg")
示例2
如果要对很多张图片进行特征点检测,需要将以上步骤封装到函数中,以方便复用。
import cv2
import dlib
def mark_faces(image_path, output_path):
# 加载图片
image = cv2.imread(image_path)
# 创建人脸检测器
detector = dlib.get_frontal_face_detector()
# 在图像中找到人脸
faces = detector(image)
# 加载特征点检测器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# 对每张人脸检测68个特征点
for face in faces:
landmarks = predictor(image, face)
for n in range(68):
x = landmarks.part(n).x
y = landmarks.part(n).y
# 将检测到的特征点绘制到图片上
cv2.circle(image, (x, y), 1, (0, 0, 255), -1)
# 将结果保存到文件中
cv2.imwrite(output_path, image)
mark_faces("test.jpg", "result.jpg")
如此,便可以简单地对很多张图片进行68个特征点的标定了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python3利用Dlib19.7实现人脸68个特征点标定 - Python技术站