diff --git a/__pycache__/draw.cpython-312.pyc b/__pycache__/draw.cpython-312.pyc new file mode 100644 index 0000000..d17de99 Binary files /dev/null and b/__pycache__/draw.cpython-312.pyc differ diff --git a/__pycache__/filter.cpython-312.pyc b/__pycache__/filter.cpython-312.pyc new file mode 100644 index 0000000..0fc0ff3 Binary files /dev/null and b/__pycache__/filter.cpython-312.pyc differ diff --git a/__pycache__/utils.cpython-312.pyc b/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000..4b59bfc Binary files /dev/null and b/__pycache__/utils.cpython-312.pyc differ diff --git a/mac.py b/mac.py new file mode 100644 index 0000000..4cf78c1 --- /dev/null +++ b/mac.py @@ -0,0 +1,36 @@ +import cv2 +import mediapipe as mp +mp_drawing = mp.solutions.drawing_utils +mp_drawing_styles = mp.solutions.drawing_styles +mp_pose = mp.solutions.pose + +cap = cv2.VideoCapture(0) +with mp_pose.Pose( + min_detection_confidence=0.5, + min_tracking_confidence=0.5) as pose: + while cap.isOpened(): + success, image = cap.read() + if not success: + print("Ignoring empty camera frame.") + continue + + # To improve performance, optionally mark the image as not writeable to + # pass by reference. + image.flags.writeable = False + image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) + results = pose.process(image) + + # Draw the pose annotation on the image. + image.flags.writeable = True + image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) + mp_drawing.draw_landmarks( + image, + results.pose_landmarks, + mp_pose.POSE_CONNECTIONS, + landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style()) + # Flip the image horizontally for a selfie-view display. + cv2.imshow('MediaPipe Pose', cv2.flip(image, 1)) + if cv2.waitKey(5) & 0xFF == 27: + break + +cap.release() \ No newline at end of file diff --git a/main.py b/main.py index a80419a..ced166f 100644 --- a/main.py +++ b/main.py @@ -69,68 +69,71 @@ def main(): fps = 1 / delta if delta > 0 else float('inf') # print(f"\rDelta: {delta:.4f}s, FPS: {fps:.2f}", end="") - for result in results: - kpts = result.keypoints.data[0] if len(result.keypoints.data) else None + if len(results) == 0: + continue - if kpts is None: - continue + result = results[0] + kpts = result.keypoints.data[0] if len(result.keypoints.data) else None - img = frame + if kpts is None: + continue - normalized = normalize_pose(result.keypoints.xy.cpu().numpy()[0]) + img = frame - draw = utils.normalize(result.keypoints.xy.cpu().numpy()[0]) - cv2.imshow('you', draw_new(draw * 100 + 100)) + normalized = normalize_pose(result.keypoints.xy.cpu().numpy()[0]) - if currTimeIndex != 0 and moves.index(find_closest(moves, time.time() - currTimeIndex)) == len(moves) - 1: - mehCount = totalCount - failCount - goodCount + draw = utils.normalize(result.keypoints.xy.cpu().numpy()[0]) + cv2.imshow('you', draw_new(draw * 100 + 100)) - print( - f"PODSUMOWANIE: FAIL {failCount} MEH: {mehCount} PERFECT: {goodCount} PERCENTAGE: {(goodCount + (0.95 * mehCount)) / totalCount * 100}%") - exit(1) + if currTimeIndex != 0 and moves.index(find_closest(moves, time.time() - currTimeIndex)) == len(moves) - 1: + mehCount = totalCount - failCount - goodCount - if currMove is None: - if compare_poses_boolean(moves[0][1], normalized): - currIndex = 1 - currTimeIndex = time.time() - deltaTime = time.time() - currStatus = f"Zaczoles tanczyc {currIndex}" - currMove = moves[0] + print( + f"PODSUMOWANIE: FAIL {failCount} MEH: {mehCount} PERFECT: {goodCount} PERCENTAGE: {(goodCount + (0.95 * mehCount)) / totalCount * 100}%") + exit(1) - # thread = Thread(target=print_animation, args=(moves, False)) - # thread.start() - else: - changed = False + if currMove is None: + if compare_poses_boolean(moves[0][1], normalized): + currIndex = 1 + currTimeIndex = time.time() + deltaTime = time.time() + currStatus = f"Zaczoles tanczyc {currIndex}" + currMove = moves[0] - closest = find_closest(moves, time.time() - currTimeIndex) - cv2.imshow('Dots', draw_new(closest[2])) + # thread = Thread(target=print_animation, args=(moves, False)) + # thread.start() + else: + changed = False - if abs((time.time() - currTimeIndex) - moves[currIndex][0]) > failRate: - currStatus = f"FAIL!" - failCount += 1 + closest = find_closest(moves, time.time() - currTimeIndex) + cv2.imshow('Dots', draw_new(closest[2])) - if compare_poses_boolean(closest[1], normalized): - # delays += (time.time() - deltaTime - moves[0][0]) * 1000 - # delaysCount += 1 + if abs((time.time() - currTimeIndex) - moves[currIndex][0]) > failRate: + currStatus = f"FAIL!" + failCount += 1 - currStatus = f"SUPER! {currIndex} Zostalo {len(moves)} Delay {(time.time() - currTimeIndex - closest[0]) / 1000}ms" - deltaTime = time.time() + if compare_poses_boolean(closest[1], normalized): + # delays += (time.time() - deltaTime - moves[0][0]) * 1000 + # delaysCount += 1 - currIndex = moves.index(closest) + 1 - goodCount += 1 - changed = True + currStatus = f"SUPER! {currIndex} Zostalo {len(moves)} Delay {(time.time() - currTimeIndex - closest[0]) / 1000}ms" + deltaTime = time.time() - if not changed and compare_poses_boolean(moves[currIndex][1], normalized): - # delays += (time.time() - deltaTime - moves[0][0]) * 1000 - # delaysCount += 1 + currIndex = moves.index(closest) + 1 + goodCount += 1 + changed = True - currStatus = f"SUPER! {currIndex} Zostalo {len(moves)} Delay {(time.time() - currTimeIndex - closest[0]) / 1000}ms" - deltaTime = time.time() + if not changed and compare_poses_boolean(moves[currIndex][1], normalized): + # delays += (time.time() - deltaTime - moves[0][0]) * 1000 + # delaysCount += 1 - changed = True + currStatus = f"SUPER! {currIndex} Zostalo {len(moves)} Delay {(time.time() - currTimeIndex - closest[0]) / 1000}ms" + deltaTime = time.time() - currIndex += 1 - goodCount += 1 + changed = True + + currIndex += 1 + goodCount += 1 # if do_pose_shot: # moves.append((time.time() - startTime, normalize_pose(result.keypoints.xy.cpu().numpy()[0]), result.keypoints.xy.cpu()[0])) diff --git a/moves_dump.py b/moves_dump.py index 4ce8051..238c241 100644 --- a/moves_dump.py +++ b/moves_dump.py @@ -35,7 +35,7 @@ for i, move in enumerate(moves): # Do rysowania (np. przesunięcie na ekran) - draw = utils.normalize(move[2]) + draw = utils.normalize(move[2]) * 200 + 250 cv2.imshow('you', draw_new(draw)) cv2.waitKey(1) diff --git a/utils.py b/utils.py index 35827be..b05e833 100644 --- a/utils.py +++ b/utils.py @@ -15,21 +15,26 @@ def recvall(sock, n): def distance(p1, p2): return math.sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2) -def normalize(move): - left_hip = move[11] # Left Hip - right_hip = move[12] # Right Hip +import numpy as np +def normalize(move): + left_hip = move[11] # Left Hip + right_hip = move[12] # Right Hip + nose = move[0] # Nose (głowa) + + # Środek bioder center = (left_hip + right_hip) / 2 + # Przesunięcie względem środka normalized_keypoints = move - center - distances = np.linalg.norm(normalized_keypoints[:, :2], axis=1) - max_dist = np.max(distances) - if max_dist > 0: - normalized_keypoints[:, :2] /= max_dist + # Zamiast max_dist używamy stałej miary "rozmiaru ciała" + body_height = np.linalg.norm(nose[:2] - center[:2]) # np. odległość biodra-głowa + + if body_height > 0: + normalized_keypoints[:, :2] /= body_height draw = normalized_keypoints[:, :2] - return draw def find_closest(moves, target):