有没有办法通过 Mediapipe 将 468 个地标映射/转换为 68 个地标?

问题描述 投票:0回答:1

我正在尝试将地面真实面部标志(68 个标志)与 Mediapipe 标志检测(468 个标志)进行比较。为此,我认为我需要以某种方式将 468 个地标映射到 68 个地标。我可能的解决方案是手动查找最接近 68 个地标中每个地标的索引并输出它们。但我不确定这里的准确性。有人可以在这方面帮助我吗?

computer-vision dlib mediapipe
1个回答
6
投票

我不是这方面的专家,但我认为没有直接的方法可以进行转换,这是因为一侧到另一侧的映射不同。

对此,我采取了与您提到的相同的想法,并且我提取了最接近的点。

这是我添加到 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))

现在该列表(提取的地标)您可以在代码中使用它

© www.soinside.com 2019 - 2024. All rights reserved.