Resolve WES-41 "Normalization"
This commit is contained in:
committed by
Victor Mylle
parent
ba44762eba
commit
9f7197e4e9
@@ -54,35 +54,63 @@ while True:
|
||||
if k1 and (k2 or k3):
|
||||
data = np.array([k1 + (k2 or [0] * 42) + (k3 or [0] * 42)])
|
||||
|
||||
def normalize_hand(frame, data, hand):
|
||||
def normalize_hand(frame, data, hand, algorithm="minmax"):
|
||||
hand_columns = np.array([i for i in range(66 + (42 if hand == "right_hand" else 0), 108 + (42 if hand == "right_hand" else 0))])
|
||||
hand_data = np.array(data[0])[hand_columns]
|
||||
|
||||
# convert to absolute pixels
|
||||
hand_data = hand_data.reshape(21, 2)
|
||||
|
||||
hand_data[:, 0] *= frame.shape[1]
|
||||
hand_data[:, 1] *= frame.shape[0]
|
||||
|
||||
min_x, min_y = np.min(hand_data[:, 0]), np.min(hand_data[:, 1])
|
||||
max_x, max_y = np.max(hand_data[:, 0]), np.max(hand_data[:, 1])
|
||||
|
||||
center_x, center_y = (min_x + max_x) / 2, (min_y + max_y) / 2
|
||||
width, height = max_x - min_x, max_y - min_y
|
||||
|
||||
bbox_width, bbox_height = max_x - min_x, max_y - min_y
|
||||
if algorithm == "minmax":
|
||||
bbox_height, bbox_width = height, width
|
||||
center_x, center_y = (min_x + max_x) / 2, (min_y + max_y) / 2
|
||||
|
||||
starting_x, starting_y = min_x, min_y
|
||||
ending_x, ending_y = max_x, max_y
|
||||
|
||||
elif algorithm == "bohacek":
|
||||
if width > height:
|
||||
delta_x = 0.1 * width
|
||||
delta_y = delta_x + ((width - height) / 2)
|
||||
else:
|
||||
delta_y = 0.1 * height
|
||||
delta_x = delta_y + ((height - width) / 2)
|
||||
|
||||
starting_x, starting_y = min_x - delta_x, min_y - delta_y
|
||||
ending_x, ending_y = max_x + delta_x, max_y + delta_y
|
||||
|
||||
center_x, center_y = (starting_x + ending_x) / 2, (starting_y + ending_y) / 2
|
||||
bbox_height, bbox_width = ending_y - starting_y, ending_x - starting_x
|
||||
|
||||
else:
|
||||
print("Not a valid normalization algorithm")
|
||||
return data, frame
|
||||
|
||||
if bbox_height == 0 or bbox_width == 0:
|
||||
return data, frame
|
||||
|
||||
center_coords = np.tile(np.array([center_x, center_y]), (21, 1)).reshape(21, 2)
|
||||
|
||||
hand_data = (hand_data - center_coords) / np.tile(np.array([bbox_width, bbox_height]), (21, 1)).reshape(21, 2)
|
||||
bbox_dims = np.tile(np.array([bbox_width, bbox_height]), (21, 1)).reshape(21, 2)
|
||||
|
||||
hand_data = (hand_data - center_coords) / bbox_dims
|
||||
|
||||
# add bouding box to frame
|
||||
frame = cv2.rectangle(frame, (int(min_x * frame.shape[1]), int(min_y * frame.shape[0])), (int(max_x * frame.shape[1]), int(max_y * frame.shape[0])), (0, 255, 0), 2)
|
||||
frame = cv2.rectangle(frame, (int(starting_x), int(starting_y)), (int(ending_x), int(ending_y)), (0, 255, 0), 2)
|
||||
|
||||
data[:, hand_columns] = hand_data.reshape(-1, 42)
|
||||
return data, frame
|
||||
|
||||
data, frame = normalize_hand(frame, data, "left_hand")
|
||||
data, frame = normalize_hand(frame, data, "right_hand")
|
||||
norm_alg = "minmax"
|
||||
|
||||
data, frame = normalize_hand(frame, data, "left_hand", norm_alg)
|
||||
data, frame = normalize_hand(frame, data, "right_hand", norm_alg)
|
||||
|
||||
# get values of the landmarks as a list of integers
|
||||
values = []
|
||||
|
||||
Reference in New Issue
Block a user