我正在尝试将地面真实面部标志(68 个标志)与 Mediapipe 标志检测(468 个标志)进行比较。为此,我认为我需要以某种方式将 468 个地标映射到 68 个地标。我可能的解决方案是手动查找最接近 68 个地标中每个地标的索引并输出它们。但我不确定这里的准确性。有人可以在这方面帮助我吗?
我不是这方面的专家,但我认为没有直接的方法可以进行转换,这是因为一侧到另一侧的映射不同。
对此,我采取了与您提到的相同的想法,并且我提取了最接近的点。
这是我添加到 mediapipe 建议在 dlib 中使用的代码中的代码。考虑到许多点彼此重合,最终结果并没有那么错误。
在 MediaPipe Face Mesh 代码示例的开头,您应该添加一个列表,其中包含与 dlib 68 个地标匹配的点的选择:
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_face_mesh = mp.solutions.face_mesh
#New Add
landmark_points_68 = [162,234,93,58,172,136,149,148,152,377,378,365,397,288,323,454,389,71,63,105,66,107,336,
296,334,293,301,168,197,5,4,75,97,2,326,305,33,160,158,133,153,144,362,385,387,263,373,
380,61,39,37,0,267,269,291,405,314,17,84,181,78,82,13,312,308,317,14,87]
在 MediaPipe Face Mesh 代码示例中查找以下行:
for face_landmarks in results.multi_face_landmarks:
然后添加以下内容:
landmarks_extracted = []
for index in landmark_points_68:
x = int(face_landmarks.landmark[index].x * width)
y = int(face_landmarks.landmark[index].y * height)
landmarks_extracted.append((x, y))
现在该列表(提取的地标)您可以在代码中使用它