|
import cv2 |
|
import mediapipe as mp |
|
import numpy as np |
|
|
|
mp_holistic = mp.solutions.holistic |
|
mp_drawing = mp.solutions.drawing_utils |
|
|
|
def mediapipe_detection(image, model): |
|
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) |
|
image.flags.writeable = False |
|
landmarks = model.process(image) |
|
image.flags.writeable = True |
|
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) |
|
return image, landmarks |
|
|
|
def draw(image, results): |
|
mp_drawing.draw_landmarks(image, results.face_landmarks, mp_holistic.FACEMESH_TESSELATION, |
|
mp_drawing.DrawingSpec(color=(0,0,255), thickness=3, circle_radius=3), |
|
mp_drawing.DrawingSpec(color=(0,0,0), thickness=1, circle_radius=0)) |
|
mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS, |
|
mp_drawing.DrawingSpec(color=(0,150,0), thickness=3, circle_radius=3), |
|
mp_drawing.DrawingSpec(color=(0,0,0), thickness=2, circle_radius=2)) |
|
mp_drawing.draw_landmarks(image, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS, |
|
mp_drawing.DrawingSpec(color=(200,56,12), thickness=3, circle_radius=3), |
|
mp_drawing.DrawingSpec(color=(0,0,0), thickness=2, circle_radius=2)) |
|
mp_drawing.draw_landmarks(image, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS, |
|
mp_drawing.DrawingSpec(color=(250,56,12), thickness=3, circle_radius=3), |
|
mp_drawing.DrawingSpec(color=(0,0,0), thickness=2, circle_radius=2)) |
|
|
|
def extract_coordinates(results): |
|
face = np.array([[res.x, res.y, res.z] for res in results.face_landmarks.landmark]) if results.face_landmarks else np.empty((468, 3))*np.nan |
|
pose = np.array([[res.x, res.y, res.z] for res in results.pose_landmarks.landmark]) if results.pose_landmarks else np.empty((33, 3))*np.nan |
|
lh = np.array([[res.x, res.y, res.z] for res in results.left_hand_landmarks.landmark]) if results.left_hand_landmarks else np.empty((21, 3))*np.nan |
|
rh = np.array([[res.x, res.y, res.z] for res in results.right_hand_landmarks.landmark]) if results.right_hand_landmarks else np.empty((21, 3))*np.nan |
|
return np.concatenate([face, lh, pose, rh]) |
|
|
|
def extract_landmarks(frames): |
|
final_landmarks = [] |
|
with mp_holistic.Holistic(min_detection_confidence=0.5, min_tracking_confidence=0.5) as holistic: |
|
for frame in frames: |
|
image, results = mediapipe_detection(frame, holistic) |
|
draw(image, results) |
|
landmarks = extract_coordinates(results) |
|
final_landmarks.extend(landmarks) |
|
return final_landmarks |