MakeUp_TryOn / landmarks.py
ukzada's picture
Update landmarks.py
5410cc3 verified
Raw
History Blame Contribute Delete
1.47 kB
import cv2
import numpy as np
from typing import List, Iterable, Optional
from mediapipe.python.solutions.face_mesh import FaceMesh # Correct import
def detect_landmarks(src: np.ndarray, is_stream: bool = False) -> Optional[List]:
"""
Given an image `src`, retrieves the facial landmarks associated with it.
Works with Mediapipe 0.10+.
"""
with FaceMesh(
static_image_mode=not is_stream,
max_num_faces=1,
refine_landmarks=True,
min_detection_confidence=0.5,
min_tracking_confidence=0.5
) as fm:
results = fm.process(cv2.cvtColor(src, cv2.COLOR_BGR2RGB))
if results.multi_face_landmarks:
return results.multi_face_landmarks[0].landmark
return None
def normalize_landmarks(landmarks, height: int, width: int, mask: Iterable = None) -> np.ndarray:
normalized_landmarks = np.array([
(int(landmark.x * width), int(landmark.y * height)) for landmark in landmarks
])
if mask is not None:
normalized_landmarks = normalized_landmarks[mask]
return normalized_landmarks
def plot_landmarks(src: np.ndarray, landmarks: List, show: bool = False) -> np.ndarray:
dst = src.copy()
for x, y in landmarks:
cv2.circle(dst, (x, y), 2, (0, 255, 0), cv2.FILLED)
if show:
print("Displaying image plotted with landmarks")
cv2.imshow("Plotted Landmarks", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
return dst