import math import numpy as np import matplotlib.pyplot as plt import cv2 from tensorflow.keras import preprocessing def euclidean_distance(point1, point2): return math.sqrt((point2[0] - point1[0]) ** 2 + (point2[1] - point1[1]) ** 2) def convert_to_real_measurements(pixel_measurement, pixel_height, real_height_cm): height_ratio = real_height_cm / pixel_height return pixel_measurement * height_ratio def measure_body_sizes(side_colored_mask, front_colored_mask, sideposes, frontposes, real_height_cm, rainbow): """Measure various body sizes based on detected poses.""" measurements = [] for pose in frontposes: # Assuming each `pose` is a dictionary with 'keypoints' that are already in the required format keypoints = pose[0] # This should directly give us the dictionary # Extract positions directly from keypoints left_eye = keypoints[1].position right_eye = keypoints[2].position nose = keypoints[3].position right_ear = keypoints[4].position left_shoulder = keypoints[5].position right_shoulder = keypoints[6].position left_elbow = keypoints[7].position right_elbow = keypoints[8].position left_wrist = keypoints[9].position right_wrist = keypoints[10].position left_hip = keypoints[11].position right_hip = keypoints[12].position left_knee = keypoints[13].position right_knee = keypoints[14].position left_ankle = keypoints[15].position right_ankle = keypoints[16].position # Calculate pixel height (from the top of the head to the bottom of the ankle) pixel_height = euclidean_distance((left_eye.x, left_eye.y), (left_ankle.x, left_ankle.y)) shoulder_width_cm = convert_to_real_measurements( euclidean_distance((left_shoulder.x, left_shoulder.y),(right_shoulder.x, right_shoulder.y)), pixel_height, real_height_cm ) # arm_length_cm = convert_to_real_measurements( # euclidean_distance((right_shoulder.x, right_shoulder.y), (right_elbow.x, right_elbow.y)), # pixel_height, real_height_cm # ) + convert_to_real_measurements( # euclidean_distance((right_elbow.x, right_elbow.y), (right_wrist.x, right_wrist.y)), # pixel_height, real_height_cm # ) # leg_length_cm = convert_to_real_measurements( # euclidean_distance((left_hip.x, left_hip.y), (left_knee.x, left_knee.y)), # pixel_height, real_height_cm # ) + convert_to_real_measurements( # euclidean_distance((left_knee.x, left_knee.y), (left_ankle.x, left_ankle.y)), # pixel_height, real_height_cm # ) arm_length_cm = convert_to_real_measurements( euclidean_distance((left_shoulder.x, left_shoulder.y), (left_wrist.x, left_wrist.y)), pixel_height, real_height_cm ) leg_length_cm = convert_to_real_measurements( euclidean_distance((left_hip.x, left_hip.y), (left_ankle.x, right_ankle.y)), pixel_height, real_height_cm ) shoulder_to_waist_cm = convert_to_real_measurements( euclidean_distance((left_shoulder.x, left_shoulder.y), (left_hip.x, left_hip.y)), pixel_height, real_height_cm ) # Calculate waist circumference using the ellipse circumference formula a = euclidean_distance((left_hip.x, left_hip.y), (right_hip.x, right_hip.y)) / 2 # b = euclidean_distance((), ()) / 2 # Use Ramanujan's approximation for the circumference of an ellipse # waist_circumference_px = math.pi * (3*(a + b) - math.sqrt((3*a + b)*(a + 3*b))) waist_circumference_cm = 90 #convert_to_real_measurements(waist_circumference_px, pixel_height, real_height_cm) # Convert pixel measurements to real measurements using the height ratio measurements.append({ "shoulder_width_cm": shoulder_width_cm, "leg_length_cm": leg_length_cm, "arm_length_cm": arm_length_cm, "shoulder_to_waist_cm": shoulder_to_waist_cm, "height_cm": real_height_cm, "waist_circumference_cm": waist_circumference_cm }) return measurements