From 40dc5b3b59f0e4d6a7199dab532666968610d6af Mon Sep 17 00:00:00 2001 From: Tulis12 Date: Fri, 28 Nov 2025 08:31:35 +0000 Subject: [PATCH] working --- __pycache__/draw.cpython-312.pyc | Bin 0 -> 98806 bytes __pycache__/filter.cpython-312.pyc | Bin 0 -> 5316 bytes __pycache__/utils.cpython-312.pyc | Bin 0 -> 2674 bytes mac.py | 36 +++++++++++ main.py | 93 +++++++++++++++-------------- moves_dump.py | 2 +- utils.py | 21 ++++--- 7 files changed, 98 insertions(+), 54 deletions(-) create mode 100644 __pycache__/draw.cpython-312.pyc create mode 100644 __pycache__/filter.cpython-312.pyc create mode 100644 __pycache__/utils.cpython-312.pyc create mode 100644 mac.py diff --git a/__pycache__/draw.cpython-312.pyc b/__pycache__/draw.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d17de99595b9cec5d15cef7ad79c92f8cbc41bfa GIT binary patch literal 98806 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

!5C#=T@VpaIY8aEjjMN&&G%zEhhA|V&aII#{ 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 t1NUPFuG 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):