我们的visualize_facial_landmarks 函数需要两个参数,后跟两个可选参数,每个参数的详细信息如下:
image :我们将在其上绘制面部标志性可视化的图像。
shape : NumPy 数组,包含映射到不同面部部位的 68 个面部标志坐标。
colors :用于对每个面部标志区域进行颜色编码的 BGR 元组列表。
alpha :用于控制原始图像上叠加层的不透明度的参数。
我们现在准备通过面部标志来可视化每个单独的面部区域:
分别循环面部标志区域
for (i, name) in enumerate(FACIAL_LANDMARKS_IDXS.keys()):
获取与关联的 (x, y) 坐标
#人脸地标
(j, k) = FACIAL_LANDMARKS_IDXS[name]
pts = shape[j:k]
检查是否应该绘制下颌线
if name == “jaw”:
由于下颌线是一个非封闭的面部区域,
只在 (x, y) 坐标之间画线
for l in range(1, len(pts)):
ptA = tuple(pts[l - 1])
ptB = tuple(pts[l])
cv2.line(overlay, ptA, ptB, colors[i], 2)
否则,计算人脸的凸包
地标坐标点并显示
else:
hull = cv2.convexHull(pts)
cv2.drawContours(overlay, [hull], -1, colors[i], -1)
遍历 FACIAL_LANDMARKS_IDXS 字典中的每个条目。
对于这些区域中的每一个,我们提取给定面部部分的索引并从形状 NumPy 数组中获取 (x, y) 坐标。
检查是否正在绘制下颌,如果是,只需循环各个点,绘制一条将下颌点连接在一起的线。
否则,处理计算点的凸包并在叠加层上绘制包。
最后一步是通过 cv2.addWeighted 函数创建透明叠加层:
应用透明覆盖
cv2.addWeighted(overlay, alpha, output, 1 - alpha, 0, output)
return the output image
return output
将visualize_facial_landmarks 应用于图像和关联的面部标记后,输出将类似于下图:
使用 dlib、OpenCV 和 Python 提取部分人脸
=============================