LSF_transcription / lsf /skeleton.py
SamDNX's picture
Initial commit: LSF (French Sign Language) interpreter
5029d29
Raw
History Blame Contribute Delete
2.34 kB
"""Draw the holistic skeleton (face mesh, pose, both hands) onto a frame."""
from __future__ import annotations
import numpy as np
from .landmarks import HolisticTracker, LandmarkFrame
def draw_skeleton(
bgr_frame: np.ndarray,
frame: LandmarkFrame,
tracker: HolisticTracker,
*,
draw_face: bool = True,
draw_pose: bool = True,
draw_hands: bool = True,
) -> np.ndarray:
"""Overlay the detected skeleton on a BGR frame, in place, and return it."""
if frame.raw is None:
return bgr_frame
mp_h = tracker.mp_holistic
mp_d = tracker.mp_drawing
mp_s = tracker.mp_styles
result = frame.raw
if draw_face and result.face_landmarks is not None:
# Tesselation gives the full mesh; contours highlight eyes + lips.
mp_d.draw_landmarks(
bgr_frame,
result.face_landmarks,
mp_h.FACEMESH_TESSELATION,
landmark_drawing_spec=None,
connection_drawing_spec=mp_s.get_default_face_mesh_tesselation_style(),
)
mp_d.draw_landmarks(
bgr_frame,
result.face_landmarks,
mp_h.FACEMESH_CONTOURS,
landmark_drawing_spec=None,
connection_drawing_spec=mp_s.get_default_face_mesh_contours_style(),
)
if draw_pose and result.pose_landmarks is not None:
mp_d.draw_landmarks(
bgr_frame,
result.pose_landmarks,
mp_h.POSE_CONNECTIONS,
landmark_drawing_spec=mp_s.get_default_pose_landmarks_style(),
)
if draw_hands:
if result.left_hand_landmarks is not None:
mp_d.draw_landmarks(
bgr_frame,
result.left_hand_landmarks,
mp_h.HAND_CONNECTIONS,
landmark_drawing_spec=mp_s.get_default_hand_landmarks_style(),
connection_drawing_spec=mp_s.get_default_hand_connections_style(),
)
if result.right_hand_landmarks is not None:
mp_d.draw_landmarks(
bgr_frame,
result.right_hand_landmarks,
mp_h.HAND_CONNECTIONS,
landmark_drawing_spec=mp_s.get_default_hand_landmarks_style(),
connection_drawing_spec=mp_s.get_default_hand_connections_style(),
)
return bgr_frame