python-3.x MediaPipe可以指定脸部网格的哪些部分是嘴唇、鼻子或眼睛吗?

w41d8nur  于 2022-12-24  发布在  Python
关注(0)|答案(1)|浏览(145)

MediaPipe能够提供脸部多个点的x,y,z点,使其能够生成一个脸部网格。但是,输出只是x,y,z点。有没有办法知道这些点中的哪些是嘴唇的点?

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

# For static images:
IMAGE_FILES = []
drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1)
with mp_face_mesh.FaceMesh(
    static_image_mode=True,
    max_num_faces=1,
    refine_landmarks=True,
    min_detection_confidence=0.5) as face_mesh:
  for idx, file in enumerate(IMAGE_FILES):
    image = cv2.imread(file)
    # Convert the BGR image to RGB before processing.
    results = face_mesh.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

    # Print and draw face mesh landmarks on the image.
    if not results.multi_face_landmarks:
      continue
    annotated_image = image.copy()
    for face_landmarks in results.multi_face_landmarks:
      print('face_landmarks:', face_landmarks)
      mp_drawing.draw_landmarks(
          image=annotated_image,
          landmark_list=face_landmarks,
          connections=mp_face_mesh.FACEMESH_TESSELATION,
          landmark_drawing_spec=None,
          connection_drawing_spec=mp_drawing_styles
          .get_default_face_mesh_tesselation_style())
      mp_drawing.draw_landmarks(
          image=annotated_image,
          landmark_list=face_landmarks,
          connections=mp_face_mesh.FACEMESH_CONTOURS,
          landmark_drawing_spec=None,
          connection_drawing_spec=mp_drawing_styles
          .get_default_face_mesh_contours_style())
      mp_drawing.draw_landmarks(
          image=annotated_image,
          landmark_list=face_landmarks,
          connections=mp_face_mesh.FACEMESH_IRISES,
          landmark_drawing_spec=None,
          connection_drawing_spec=mp_drawing_styles
          .get_default_face_mesh_iris_connections_style())
    cv2.imwrite('/tmp/annotated_image' + str(idx) + '.png', annotated_image)

输出:

landmark {
  x: 0.5328186750411987
  y: 0.3934963345527649
  z: -0.008206618018448353
}
landmark {
  x: 0.5807108879089355
  y: 0.3586674928665161
  z: 0.017649170011281967
}
landmark {
  x: 0.5844370126724243
  y: 0.3515523076057434
  z: 0.01841720938682556
}
...and more such points
093gszye

093gszye1#

确保导入matplotlib import matplotlib.pyplot as plt

xVal = []; yVal = []; zVal = []
xS = []; yS = []
for land in results.multi_face_landmarks:
    print(type(land.landmark))
    count = 0
    for i in land.landmark:
      xVal.append(i.x)
      yVal.append(i.y)
      zVal.append(i.z)
      if count == 0 or (count >= 11 and count <= 17): #some points on the lip
        xS.append(i.x); yS.append(i.y)
      count = count + 1
    print("Total = ", count)
plt.scatter(xVal, yVal, color = 'blue')
plt.scatter(xS, yS, color = 'red')
plt.show()

脸部的点与图中的点相匹配。您需要下载图片并放大才能看到数字。

相关问题