from typing import List import cv2 import numpy as np # ================================================================================================== def use_whole_body(whole_body: dict) -> bool: return any((whole_body[k] for k in whole_body)) # ================================================================================================== def get_joint_names(whole_body: dict): joint_names_2d = [ "nose", "eye_left", "eye_right", "ear_left", "ear_right", "shoulder_left", "shoulder_right", "elbow_left", "elbow_right", "wrist_left", "wrist_right", "hip_left", "hip_right", "knee_left", "knee_right", "ankle_left", "ankle_right", ] if whole_body["foots"]: joint_names_2d.extend( [ "foot_toe_big_left", "foot_toe_small_left", "foot_heel_left", "foot_toe_big_right", "foot_toe_small_right", "foot_heel_right", ] ) if whole_body["face"]: joint_names_2d.extend( [ "face_jaw_right_1", "face_jaw_right_2", "face_jaw_right_3", "face_jaw_right_4", "face_jaw_right_5", "face_jaw_right_6", "face_jaw_right_7", "face_jaw_right_8", "face_jaw_middle", "face_jaw_left_1", "face_jaw_left_2", "face_jaw_left_3", "face_jaw_left_4", "face_jaw_left_5", "face_jaw_left_6", "face_jaw_left_7", "face_jaw_left_8", "face_eyebrow_right_1", "face_eyebrow_right_2", "face_eyebrow_right_3", "face_eyebrow_right_4", "face_eyebrow_right_5", "face_eyebrow_left_1", "face_eyebrow_left_2", "face_eyebrow_left_3", "face_eyebrow_left_4", "face_eyebrow_left_5", "face_nose_1", "face_nose_2", "face_nose_3", "face_nose_4", "face_nose_5", "face_nose_6", "face_nose_7", "face_nose_8", "face_nose_9", "face_eye_right_1", "face_eye_right_2", "face_eye_right_3", "face_eye_right_4", "face_eye_right_5", "face_eye_right_6", "face_eye_left_1", "face_eye_left_2", "face_eye_left_3", "face_eye_left_4", "face_eye_left_5", "face_eye_left_6", "face_mouth_1", "face_mouth_2", "face_mouth_3", "face_mouth_4", "face_mouth_5", "face_mouth_6", "face_mouth_7", "face_mouth_8", "face_mouth_9", "face_mouth_10", "face_mouth_11", "face_mouth_12", "face_mouth_13", "face_mouth_14", "face_mouth_15", "face_mouth_16", "face_mouth_17", "face_mouth_18", "face_mouth_19", "face_mouth_20", ] ) if whole_body["hands"]: joint_names_2d.extend( [ "hand_wrist_left", "hand_finger_thumb_left_1", "hand_finger_thumb_left_2", "hand_finger_thumb_left_3", "hand_finger_thumb_left_4", "hand_finger_index_left_1", "hand_finger_index_left_2", "hand_finger_index_left_3", "hand_finger_index_left_4", "hand_finger_middle_left_1", "hand_finger_middle_left_2", "hand_finger_middle_left_3", "hand_finger_middle_left_4", "hand_finger_ring_left_1", "hand_finger_ring_left_2", "hand_finger_ring_left_3", "hand_finger_ring_left_4", "hand_finger_pinky_left_1", "hand_finger_pinky_left_2", "hand_finger_pinky_left_3", "hand_finger_pinky_left_4", "hand_wrist_right", "hand_finger_thumb_right_1", "hand_finger_thumb_right_2", "hand_finger_thumb_right_3", "hand_finger_thumb_right_4", "hand_finger_index_right_1", "hand_finger_index_right_2", "hand_finger_index_right_3", "hand_finger_index_right_4", "hand_finger_middle_right_1", "hand_finger_middle_right_2", "hand_finger_middle_right_3", "hand_finger_middle_right_4", "hand_finger_ring_right_1", "hand_finger_ring_right_2", "hand_finger_ring_right_3", "hand_finger_ring_right_4", "hand_finger_pinky_right_1", "hand_finger_pinky_right_2", "hand_finger_pinky_right_3", "hand_finger_pinky_right_4", ] ) joint_names_2d.extend( [ "hip_middle", "shoulder_middle", "head", ] ) return joint_names_2d # ================================================================================================== def load_image(path: str): image = cv2.imread(path, 3) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) image = np.asarray(image, dtype=np.uint8) return image # ================================================================================================== def rgb2bayer(img): bayer = np.zeros((img.shape[0], img.shape[1]), dtype=img.dtype) bayer[0::2, 0::2] = img[0::2, 0::2, 0] bayer[0::2, 1::2] = img[0::2, 1::2, 1] bayer[1::2, 0::2] = img[1::2, 0::2, 1] bayer[1::2, 1::2] = img[1::2, 1::2, 2] return bayer def bayer2rgb(bayer): img = cv2.cvtColor(bayer, cv2.COLOR_BayerBG2RGB) return img # ================================================================================================== def update_keypoints(poses_2d: list, joint_names: List[str], whole_body: dict) -> list: new_views = [] for view in poses_2d: new_bodies = [] for body in view: body = body.tolist() new_body = body[:17] if whole_body["foots"]: new_body.extend(body[17:23]) if whole_body["face"]: new_body.extend(body[23:91]) if whole_body["hands"]: new_body.extend(body[91:]) body = new_body hlid = joint_names.index("hip_left") hrid = joint_names.index("hip_right") mid_hip = [ float(((body[hlid][0] + body[hrid][0]) / 2.0)), float(((body[hlid][1] + body[hrid][1]) / 2.0)), min(body[hlid][2], body[hrid][2]), ] body.append(mid_hip) slid = joint_names.index("shoulder_left") srid = joint_names.index("shoulder_right") mid_shoulder = [ float(((body[slid][0] + body[srid][0]) / 2.0)), float(((body[slid][1] + body[srid][1]) / 2.0)), min(body[slid][2], body[srid][2]), ] body.append(mid_shoulder) elid = joint_names.index("ear_left") erid = joint_names.index("ear_right") head = [ float(((body[elid][0] + body[erid][0]) / 2.0)), float(((body[elid][1] + body[erid][1]) / 2.0)), min(body[elid][2], body[erid][2]), ] body.append(head) new_bodies.append(body) new_views.append(new_bodies) return new_views