使用face_landmarks()在Python中生成面部特征热图
发布时间:2023-12-27 07:46:45
生成面部特征热图是一种常见的计算机视觉任务,它可以用于面部识别、表情识别、姿势估计等应用。在Python中,可以使用dlib库中的face_landmarks()函数来生成面部特征热图。
首先,我们需要安装dlib库。可以使用以下命令来安装:
pip install dlib
接下来,我们需要导入必要的库和模块:
import dlib import cv2 import numpy as np import matplotlib.pyplot as plt
然后,我们需要加载并预处理一张人脸图像:
# 加载人脸检测器和面部关键点检测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# 加载图像
image = cv2.imread("face.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 缩放图像以加快计算速度
image = cv2.resize(image, (0, 0), fx=0.5, fy=0.5)
# 运行人脸检测器查找人脸
faces = detector(image)
# 获取面部关键点
for face in faces:
landmarks = predictor(image, face)
现在,我们可以使用面部关键点来生成面部特征热图。具体而言,我们可以绘制出眼睛、嘴巴、鼻子等区域的矩形,并在图像中标注出关键点:
# 创建一个与图像大小相同的空数组,并将其填充为透明
heatmap = np.zeros((image.shape[0], image.shape[1], 4), dtype=np.uint8)
# 绘制眼睛矩形区域
left_eye = cv2.boundingRect(np.array([(landmarks.part(36).x, landmarks.part(36).y),
(landmarks.part(37).x, landmarks.part(37).y),
(landmarks.part(38).x, landmarks.part(38).y),
(landmarks.part(39).x, landmarks.part(39).y),
(landmarks.part(40).x, landmarks.part(40).y),
(landmarks.part(41).x, landmarks.part(41).y)])))
cv2.rectangle(heatmap, (left_eye[0], left_eye[1]), (left_eye[0] + left_eye[2], left_eye[1] + left_eye[3]), (0, 255, 0, 100), -1)
right_eye = cv2.boundingRect(np.array([(landmarks.part(42).x, landmarks.part(42).y),
(landmarks.part(43).x, landmarks.part(43).y),
(landmarks.part(44).x, landmarks.part(44).y),
(landmarks.part(45).x, landmarks.part(45).y),
(landmarks.part(46).x, landmarks.part(46).y),
(landmarks.part(47).x, landmarks.part(47).y)])))
cv2.rectangle(heatmap, (right_eye[0], right_eye[1]), (right_eye[0] + right_eye[2], right_eye[1] + right_eye[3]), (0, 255, 0, 100), -1)
# 绘制嘴巴矩形区域
mouth = cv2.boundingRect(np.array([(landmarks.part(48).x, landmarks.part(48).y),
(landmarks.part(49).x, landmarks.part(49).y),
(landmarks.part(50).x, landmarks.part(50).y),
(landmarks.part(51).x, landmarks.part(51).y),
(landmarks.part(52).x, landmarks.part(52).y),
(landmarks.part(53).x, landmarks.part(53).y),
(landmarks.part(54).x, landmarks.part(54).y),
(landmarks.part(55).x, landmarks.part(55).y),
(landmarks.part(56).x, landmarks.part(56).y),
(landmarks.part(57).x, landmarks.part(57).y),
(landmarks.part(58).x, landmarks.part(58).y),
(landmarks.part(59).x, landmarks.part(59).y),
(landmarks.part(60).x, landmarks.part(60).y),
(landmarks.part(61).x, landmarks.part(61).y),
(landmarks.part(62).x, landmarks.part(62).y)])))
cv2.rectangle(heatmap, (mouth[0], mouth[1]), (mouth[0] + mouth[2], mouth[1] + mouth[3]), (0, 0, 255, 100), -1)
# 在图像中标注关键点
for i in range(68):
cv2.circle(image, (landmarks.part(i).x, landmarks.part(i).y), 1, (255, 0, 0), -1)
最后,我们可以将生成的面部特征热图和标注了关键点的图像可视化:
# 将面部特征热图与原始图像叠加
final_image = cv2.addWeighted(image, 0.7, heatmap, 0.3, 0)
# 可视化结果
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title("Original Image with Landmarks")
plt.axis("off")
plt.subplot(1, 2, 2)
plt.imshow(final_image)
plt.title("Facial Landmark Heatmap")
plt.axis("off")
plt.show()
这样,我们就完成了使用face_landmarks()函数在Python中生成面部特征热图的示例。注意,以上示例代码仅针对单张人脸图像进行展示,如果有多张人脸或者视频流需要处理,可以进行相应的修改。
