import cv2 import mediapipe as mp from mediapipe import solutions from mediapipe.framework.formats import landmark_pb2 import numpy as np def draw_mediapipe_landmarks(rgb_image: object, face_landmarks_list: object) -> object: annotated_image = np.copy(rgb_image) # Loop through the detected faces to visualize. for idx in range(len(face_landmarks_list)): face_landmarks = face_landmarks_list[idx] # Draw the face landmarks. face_landmarks_proto = landmark_pb2.NormalizedLandmarkList() face_landmarks_proto.landmark.extend([ landmark_pb2.NormalizedLandmark(x=landmark.x, y=landmark.y, z=landmark.z) for landmark in face_landmarks ]) # print(len(mp.solutions.face_mesh.FACEMESH_TESSELATION)) # exit() solutions.drawing_utils.draw_landmarks( image=annotated_image, landmark_list=face_landmarks_proto, connections=mp.solutions.face_mesh.FACEMESH_TESSELATION, # connections=FACEMESH_NOSE, landmark_drawing_spec=None, connection_drawing_spec=mp.solutions.drawing_styles.get_default_face_mesh_tesselation_style() ) solutions.drawing_utils.draw_landmarks( image=annotated_image, landmark_list=face_landmarks_proto, connections=mp.solutions.face_mesh.FACEMESH_CONTOURS, landmark_drawing_spec=None, connection_drawing_spec=mp.solutions.drawing_styles.get_default_face_mesh_contours_style()) solutions.drawing_utils.draw_landmarks( image=annotated_image, landmark_list=face_landmarks_proto, connections=mp.solutions.face_mesh.FACEMESH_IRISES, landmark_drawing_spec=None, connection_drawing_spec=mp.solutions.drawing_styles.get_default_face_mesh_iris_connections_style()) return annotated_image def draw_landmarks(canvas, landmarks, eps=1e-4, fill=(0, 0, 0), thickness=-1): h, w, c = canvas.shape for lmk in landmarks: x, y = lmk x = int(x * w) y = int(y * h) if eps < x <= w and eps < y <= h: cv2.circle(canvas, (x, y), 3, fill, thickness=thickness) return canvas