Dlib" 是一个C++库,提供了广泛的机器学习算法和工具,包括图像处理、计算机视觉、数据挖掘和机器学习等领域。它被广泛用于人脸识别、人脸关键点检测、物体检测等任务。Dlib库的特点之一是其高度的可移植性,它可以在多个平台上运行,包括Windows、Linux和macOS。
接下来会针对dlib库对于人脸关键点定位的功能来进行代码演示。
我们需要用到的模型是:shape_predictor_68_face_landmarks.dat
"shape_predictor_68_face_landmarks.dat" 是一个预训练的模型文件,用于在图像中检测人脸并定位人脸的68个关键点。这个模型文件通常与Dlib库一起使用,以进行人脸关键点检测。
这个模型是在大量人脸图像数据集上训练得到的,它可以用来定位人脸的各种关键点,包括眼睛、眉毛、鼻子、嘴巴等部位的位置。这对于许多计算机视觉应用非常有用,例如人脸表情识别、人脸识别、面部特征分析等。
通常,你可以从Dlib官方网站下载这个模型文件。注意,模型文件的大小可能会比较大,因此下载可能需要一些时间,具体文件名和路径可能会根据Dlib的版本和发布而有所不同。
一旦你下载了这个模型文件,你可以在Dlib的Python接口中使用 dlib.shape_predictor
来加载它,然后将其应用于图像以检测人脸关键点。
import numpy as np
import cv2
import dlib
img = cv2.imread("hg1.jpg") # 读取图像
detector = dlib.get_frontal_face_detector() # 构造人脸检测器
faces = detector(img, 0) # 检测人脸
# dlib.shape_predictor载入模型(加载预测器)
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
for face in faces: # 获取每一张脸的关键点(实现检测)
shape = predictor(img, face) # 获取关键点
# 将关键点转换为坐标(x,y)的形式
landmarks = np.matrix([[p.x, p.y] for p in shape.parts()])
# 绘制每一张脸的关键点(绘制shape中的每个点)
for idx, point in enumerate(landmarks):
pos = (point[0, 0], point[0, 1]) # 当前关键的坐标
# 针对当前关键点,绘制一个实心圆
cv2.circle(img, pos, 2, color=(0, 255, 0))
font = cv2.FONT_HERSHEY_SIMPLEX # 字体
cv2.putText(img, str(idx), pos, font, 0.4, (255, 255, 255), 1, cv2.LINE_AA)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()
这里对cv2.putText(),进行一些补充介绍:
cv2.putText(image, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin)
image
: 要绘制文本的图像。text
: 要绘制的文本内容。org
: 文本的起始坐标,通常是一个元组 (x, y) 表示文本的左下角位置。fontFace
: 字体类型,通常使用 cv2.FONT_HERSHEY_
开头的常量,如 cv2.FONT_HERSHEY_SIMPLEX
。fontScale
: 字号缩放因子。color
: 文本颜色,通常是一个BGR格式的元组,例如 (0, 255, 0) 表示绿色。thickness
: 文本的线宽,通常为一个整数值,-1 表示填充文本。lineType
: 文本轮廓线的类型,通常使用 cv2.LINE_AA
实现抗锯齿效果。bottomLeftOrigin
: 一个布尔值,指示 org
坐标是否表示文本的左下角(True)或左上角(False)。图中可以看出目标图像上有68个被标记的关键点,这与选择的预训练模型有关。