ehsanhon commited on
Commit
fc6c03a
·
verified ·
1 Parent(s): f3418c1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +295 -293
app.py CHANGED
@@ -1,293 +1,295 @@
1
- from flask import Flask, request, send_file
2
- # from flask_ngrok import run_with_ngrok
3
- from io import BytesIO
4
- import mimetypes
5
- # import cv2
6
- # import numpy as np
7
- # import mediapipe as mp
8
- # import math
9
- from pyngrok import ngrok
10
-
11
- # def calculate_angle(point1, point2, point3):
12
- # """
13
- # Calculates the angle at point2 formed by the lines connecting it to point1 and point3.
14
-
15
- # Args:
16
- # point1 (tuple): Coordinates (x, y) of the first point.
17
- # point2 (tuple): Coordinates (x, y) of the vertex (the point where the angle is).
18
- # point3 (tuple): Coordinates (x, y) of the third point.
19
-
20
- # Returns:
21
- # float: The angle in degrees.
22
- # """
23
- # x1, y1 = point1
24
- # x2, y2 = point2
25
- # x3, y3 = point3
26
-
27
- # # Calculate vectors
28
- # vector1 = (x1 - x2, y1 - y2)
29
- # vector2 = (x3 - x2, y3 - y2)
30
-
31
- # # Calculate dot product
32
- # dot_product = vector1[0] * vector2[0] + vector1[1] * vector2[1]
33
-
34
- # # Calculate magnitudes (lengths) of the vectors
35
- # magnitude1 = math.sqrt(vector1[0]**2 + vector1[1]**2)
36
- # magnitude2 = math.sqrt(vector2[0]**2 + vector2[1]**2)
37
-
38
- # # Calculate cosine of the angle
39
- # if magnitude1 == 0 or magnitude2 == 0:
40
- # return 0.0 # Handle cases where points are the same
41
- # cos_theta = dot_product / (magnitude1 * magnitude2)
42
-
43
- # # Ensure cos_theta is within the valid range [-1, 1] due to potential floating-point errors
44
- # cos_theta = max(-1.0, min(1.0, cos_theta))
45
-
46
- # # Calculate the angle in radians and convert to degrees
47
- # angle_radians = math.acos(cos_theta)
48
- # angle_degrees = math.degrees(angle_radians)
49
-
50
- # return angle_degrees
51
-
52
- # # Function to extract the coordinates of a landmark
53
- # def get_landmark_coordinates(landmarks, landmark_id):
54
- # try:
55
- # x = landmarks.landmark[landmark_id].x
56
- # y = landmarks.landmark[landmark_id].y
57
- # x=x/1
58
- # y=y/1
59
- # return np.array([x, y])
60
- # except:
61
- # return np.array([0, 0]) # Return [0, 0] if landmark is not detected
62
-
63
- # mp_pose = mp.solutions.pose
64
- # pose = mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5)
65
- # mp_drawing = mp.solutions.drawing_utils
66
-
67
- # def calculate_angles_landmarks(landmarks):
68
- # # Left side angles
69
- # left_shoulder = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_SHOULDER)
70
- # left_elbow = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_ELBOW)
71
- # left_wrist = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_WRIST)
72
- # #
73
- # right_shoulder = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_SHOULDER)
74
- # right_elbow = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_ELBOW)
75
- # right_wrist = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_WRIST)
76
- # #
77
- # left_hip = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_HIP)
78
- # left_knee = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_KNEE)
79
- # #
80
- # right_hip = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_HIP)
81
- # right_knee = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_KNEE)
82
- # #
83
- # left_ankle = get_landmark_coordinates(landmarks,mp_pose.PoseLandmark.LEFT_ANKLE)
84
- # right_ankle = get_landmark_coordinates(landmarks,mp_pose.PoseLandmark.RIGHT_ANKLE)
85
- # #
86
-
87
- # if np.any(left_shoulder) and np.any(left_elbow) and np.any(left_wrist):
88
- # left_elbow_angle = calculate_angle(left_shoulder, left_elbow, left_wrist)
89
- # else: left_elbow_angle = 0
90
-
91
- # if np.any(left_shoulder) and np.any(left_hip) and np.any(left_knee):
92
- # left_hip_angle = calculate_angle(left_shoulder, left_hip, left_knee)
93
- # else: left_hip_angle = 0
94
-
95
- # if np.any(right_shoulder) and np.any(right_elbow) and np.any(right_wrist):
96
- # right_elbow_angle = calculate_angle(right_shoulder, right_elbow, right_wrist)
97
- # else: right_elbow_angle = 0
98
-
99
- # if np.any(right_shoulder) and np.any(right_hip) and np.any(right_knee):
100
- # right_hip_angle = calculate_angle(right_shoulder, right_hip, right_knee)
101
- # else: right_hip_angle = 0
102
-
103
- # if np.any(right_knee) and np.any(right_ankle) and np.any(right_hip):
104
- # right_knee_angle = calculate_angle(right_knee, right_ankle, right_hip)
105
- # else: right_knee_angle = 0
106
-
107
- # if np.any(left_knee) and np.any(left_ankle) and np.any(left_hip):
108
- # left_knee_angle = calculate_angle(left_knee, left_ankle, left_hip)
109
- # else: left_knee_angle = 0
110
-
111
-
112
- # # Additional angles (e.g., shoulders, knees, etc.)
113
- # head0 = 0
114
- # num = 0
115
- # head = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.NOSE)
116
- # if not np.array_equal(head, head0): num += 1
117
- # head0 = head
118
-
119
- # head += get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_EYE)
120
- # if (head[0]==head0[0]) & (head[1]==head0[1]): num += 1
121
- # head0 = head
122
-
123
- # head += get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_EYE)
124
- # if (head[0]==head0[0]) & (head[1]==head0[1]): num += 1
125
- # head0 = head
126
-
127
- # head += get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_EAR)
128
- # if (head[0]==head0[0]) & (head[1]==head0[1]): num += 1
129
- # head0 = head
130
-
131
- # head += get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_EAR)
132
- # if (head[0]==head0[0]) & (head[1]==head0[1]): num += 1
133
- # head0 = head
134
-
135
- # head /= num
136
-
137
- # if np.any(head) and np.any(left_shoulder) and np.any(left_elbow):
138
- # left_arm_angle = calculate_angle(head, left_shoulder, left_elbow)
139
- # else:
140
- # left_arm_angle = 0
141
-
142
- # if np.any(head) and np.any(right_shoulder) and np.any(right_elbow):
143
- # right_arm_angle = calculate_angle(head, right_shoulder, right_elbow)
144
- # else:
145
- # right_arm_angle = 0
146
-
147
- # if np.any(head) and np.any(left_shoulder) and np.any(left_hip):
148
- # left_back_angle = calculate_angle(head, left_shoulder, left_hip)
149
- # else:
150
- # left_back_angle = 0
151
-
152
- # if np.any(head) and np.any(right_shoulder) and np.any(right_hip):
153
- # right_back_angle = calculate_angle(head, right_shoulder, right_hip)
154
- # else:
155
- # right_back_angle = 0
156
- # ###############
157
- # angles = {
158
- # "left_elbow_angle": left_elbow_angle,
159
- # "left_hip_angle": left_hip_angle,
160
- # "right_elbow_angle": right_elbow_angle,
161
- # "right_hip_angle": right_hip_angle,
162
- # "left_arm_angle": left_arm_angle,
163
- # "right_arm_angle": right_arm_angle,
164
- # "left_back_angle": left_back_angle,
165
- # "right_back_angle": right_back_angle,
166
- # "left_knee_angle": left_knee_angle,
167
- # "right_knee_angle": right_knee_angle
168
- # }
169
-
170
- # locations={
171
- # "left_shoulder":left_shoulder,
172
- # "left_elbow":left_elbow,
173
- # "left_wrist":left_wrist,
174
- # "right_shoulder":right_shoulder,
175
- # "right_elbow":right_elbow,
176
- # "right_wrist":right_wrist,
177
-
178
- # "head":head,
179
-
180
- # "left_hip":left_hip,
181
- # "left_knee":left_knee,
182
- # "left_ankle":left_ankle,
183
-
184
- # "right_hip":right_hip,
185
- # "right_knee":right_knee,
186
- # "right_ankle":right_ankle
187
- # }
188
- # return angles,locations
189
-
190
- # # Function to calculate the angles for both left and right sides and overlay on image
191
- # def calculate_and_display_angles(image_path, return_angles=False):
192
- # mp_pose = mp.solutions.pose
193
- # pose = mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5)
194
-
195
- # image = cv2.imread(image_path)
196
- # image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
197
-
198
- # # Get pose landmarks
199
- # results = pose.process(image_rgb)
200
-
201
- # if results.pose_landmarks:
202
- # # landmarks = results.pose_landmarks
203
- # ########
204
- # ang , locs = calculate_angles_landmarks(results.pose_landmarks)
205
-
206
- # #if only angles needed
207
- # if return_angles:
208
- # return ang
209
-
210
- # # Draw the pose landmarks on the image
211
- # mp_drawing = mp.solutions.drawing_utils
212
- # mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
213
-
214
- # # Display the angle values at corresponding locations
215
- # def overlay_angle(angle, location, color=(0, 255, 0)):
216
- # # Coordinates are normalized, scale them to the image size
217
- # x = int(location[0] * image.shape[1])
218
- # y = int(location[1] * image.shape[0])
219
- # cv2.putText(image, f'{angle:.2f}', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.3, color, 1)
220
-
221
- # # Overlay angles on the image
222
- # if np.any(ang['left_elbow_angle']!=0):
223
- # overlay_angle(ang['left_elbow_angle'], locs['left_elbow'], (0, 255, 0)) # Left elbow angle
224
- # if np.any(ang['right_elbow_angle']!=0):
225
- # overlay_angle(ang['right_elbow_angle'], locs['right_elbow'], (0, 255, 0)) # Right elbow angle
226
- # if np.any(ang['left_hip_angle']!=0):
227
- # overlay_angle(ang['left_hip_angle'], locs['left_hip'], (0, 255, 0)) # Left hip angle
228
- # if np.any(ang['right_hip_angle']!=0):
229
- # overlay_angle(ang['right_hip_angle'], locs['right_hip'], (0, 255, 0)) # Right hip angle
230
- # if np.any(ang['left_arm_angle']!=0):
231
- # overlay_angle(ang['left_arm_angle'], (locs['left_shoulder']
232
- # + locs['left_elbow'])/2, (0, 255, 0)) # Left arm angle
233
- # if np.any(ang['right_arm_angle']!=0):
234
- # overlay_angle(ang['right_arm_angle'], (locs['right_shoulder']
235
- # + locs['right_elbow'])/2, (0, 255, 0))
236
- # if np.any(ang['left_back_angle']!=0):
237
- # overlay_angle(ang['left_back_angle'], locs['left_shoulder'], (0, 255, 0)) # Left back angle
238
- # if np.any(ang['right_back_angle']!=0):
239
- # overlay_angle(ang['right_back_angle'], locs['right_shoulder'], (0, 255, 0)) # Right back angle
240
-
241
- # if np.any(ang['left_knee_angle']!=0):
242
- # overlay_angle(ang['left_knee_angle'], locs['left_knee'], (0, 255, 0)) # Left knee angle
243
-
244
- # if np.any(ang['right_knee_angle']!=0):
245
- # overlay_angle(ang['right_knee_angle'], locs['right_knee'], (0, 255, 0)) # Right knee angle
246
-
247
- # # Return the image with the overlayed angles
248
- # return image
249
- # else:
250
- # return None
251
- # ###
252
-
253
-
254
-
255
-
256
- ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
257
- def allowed_file(filename):
258
- return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
259
- app = Flask(__name__)
260
- # run_with_ngrok(app) # This will use ngrok for the server
261
- public_url = ngrok.connect(5000)
262
- print(" * ngrok tunnel:", public_url)
263
-
264
- @app.route('/')
265
- def hello():
266
- return 'Hello, World!'
267
-
268
- @app.route('/1', methods=['POST'])
269
- def upload_file():
270
- if 'image' not in request.files:
271
- return {"message": "No file part"}, 400
272
- file = request.files['image']
273
- if file.filename == '':
274
- return {"message": "No selected file"}, 400
275
-
276
- # send file with angles on image or just angles
277
- if file and allowed_file(file.filename):
278
- try:
279
- file.seek(0)
280
- mime_type, _ = mimetypes.guess_type(file.filename)
281
-
282
- return send_file(
283
- BytesIO(file.read()), mimetype=mime_type,
284
- as_attachment=False, download_name=file.filename
285
- )
286
-
287
- except Exception as e:
288
- return {"message": f"Error processing file: {str(e)}"}, 500
289
- return {"message": "File not allowed"}, 400
290
-
291
-
292
- if __name__ == '__main__':
293
- app.run()
 
 
 
1
+ from flask import Flask, request, send_file
2
+ # from flask_ngrok import run_with_ngrok
3
+ from io import BytesIO
4
+ import mimetypes
5
+ # import cv2
6
+ # import numpy as np
7
+ # import mediapipe as mp
8
+ # import math
9
+ from pyngrok import ngrok
10
+ import os
11
+ os.environ["PYNGROK_CONFIG_DIR"] = "/tmp/pyngrok"
12
+
13
+ # def calculate_angle(point1, point2, point3):
14
+ # """
15
+ # Calculates the angle at point2 formed by the lines connecting it to point1 and point3.
16
+
17
+ # Args:
18
+ # point1 (tuple): Coordinates (x, y) of the first point.
19
+ # point2 (tuple): Coordinates (x, y) of the vertex (the point where the angle is).
20
+ # point3 (tuple): Coordinates (x, y) of the third point.
21
+
22
+ # Returns:
23
+ # float: The angle in degrees.
24
+ # """
25
+ # x1, y1 = point1
26
+ # x2, y2 = point2
27
+ # x3, y3 = point3
28
+
29
+ # # Calculate vectors
30
+ # vector1 = (x1 - x2, y1 - y2)
31
+ # vector2 = (x3 - x2, y3 - y2)
32
+
33
+ # # Calculate dot product
34
+ # dot_product = vector1[0] * vector2[0] + vector1[1] * vector2[1]
35
+
36
+ # # Calculate magnitudes (lengths) of the vectors
37
+ # magnitude1 = math.sqrt(vector1[0]**2 + vector1[1]**2)
38
+ # magnitude2 = math.sqrt(vector2[0]**2 + vector2[1]**2)
39
+
40
+ # # Calculate cosine of the angle
41
+ # if magnitude1 == 0 or magnitude2 == 0:
42
+ # return 0.0 # Handle cases where points are the same
43
+ # cos_theta = dot_product / (magnitude1 * magnitude2)
44
+
45
+ # # Ensure cos_theta is within the valid range [-1, 1] due to potential floating-point errors
46
+ # cos_theta = max(-1.0, min(1.0, cos_theta))
47
+
48
+ # # Calculate the angle in radians and convert to degrees
49
+ # angle_radians = math.acos(cos_theta)
50
+ # angle_degrees = math.degrees(angle_radians)
51
+
52
+ # return angle_degrees
53
+
54
+ # # Function to extract the coordinates of a landmark
55
+ # def get_landmark_coordinates(landmarks, landmark_id):
56
+ # try:
57
+ # x = landmarks.landmark[landmark_id].x
58
+ # y = landmarks.landmark[landmark_id].y
59
+ # x=x/1
60
+ # y=y/1
61
+ # return np.array([x, y])
62
+ # except:
63
+ # return np.array([0, 0]) # Return [0, 0] if landmark is not detected
64
+
65
+ # mp_pose = mp.solutions.pose
66
+ # pose = mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5)
67
+ # mp_drawing = mp.solutions.drawing_utils
68
+
69
+ # def calculate_angles_landmarks(landmarks):
70
+ # # Left side angles
71
+ # left_shoulder = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_SHOULDER)
72
+ # left_elbow = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_ELBOW)
73
+ # left_wrist = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_WRIST)
74
+ # #
75
+ # right_shoulder = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_SHOULDER)
76
+ # right_elbow = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_ELBOW)
77
+ # right_wrist = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_WRIST)
78
+ # #
79
+ # left_hip = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_HIP)
80
+ # left_knee = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_KNEE)
81
+ # #
82
+ # right_hip = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_HIP)
83
+ # right_knee = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_KNEE)
84
+ # #
85
+ # left_ankle = get_landmark_coordinates(landmarks,mp_pose.PoseLandmark.LEFT_ANKLE)
86
+ # right_ankle = get_landmark_coordinates(landmarks,mp_pose.PoseLandmark.RIGHT_ANKLE)
87
+ # #
88
+
89
+ # if np.any(left_shoulder) and np.any(left_elbow) and np.any(left_wrist):
90
+ # left_elbow_angle = calculate_angle(left_shoulder, left_elbow, left_wrist)
91
+ # else: left_elbow_angle = 0
92
+
93
+ # if np.any(left_shoulder) and np.any(left_hip) and np.any(left_knee):
94
+ # left_hip_angle = calculate_angle(left_shoulder, left_hip, left_knee)
95
+ # else: left_hip_angle = 0
96
+
97
+ # if np.any(right_shoulder) and np.any(right_elbow) and np.any(right_wrist):
98
+ # right_elbow_angle = calculate_angle(right_shoulder, right_elbow, right_wrist)
99
+ # else: right_elbow_angle = 0
100
+
101
+ # if np.any(right_shoulder) and np.any(right_hip) and np.any(right_knee):
102
+ # right_hip_angle = calculate_angle(right_shoulder, right_hip, right_knee)
103
+ # else: right_hip_angle = 0
104
+
105
+ # if np.any(right_knee) and np.any(right_ankle) and np.any(right_hip):
106
+ # right_knee_angle = calculate_angle(right_knee, right_ankle, right_hip)
107
+ # else: right_knee_angle = 0
108
+
109
+ # if np.any(left_knee) and np.any(left_ankle) and np.any(left_hip):
110
+ # left_knee_angle = calculate_angle(left_knee, left_ankle, left_hip)
111
+ # else: left_knee_angle = 0
112
+
113
+
114
+ # # Additional angles (e.g., shoulders, knees, etc.)
115
+ # head0 = 0
116
+ # num = 0
117
+ # head = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.NOSE)
118
+ # if not np.array_equal(head, head0): num += 1
119
+ # head0 = head
120
+
121
+ # head += get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_EYE)
122
+ # if (head[0]==head0[0]) & (head[1]==head0[1]): num += 1
123
+ # head0 = head
124
+
125
+ # head += get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_EYE)
126
+ # if (head[0]==head0[0]) & (head[1]==head0[1]): num += 1
127
+ # head0 = head
128
+
129
+ # head += get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_EAR)
130
+ # if (head[0]==head0[0]) & (head[1]==head0[1]): num += 1
131
+ # head0 = head
132
+
133
+ # head += get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_EAR)
134
+ # if (head[0]==head0[0]) & (head[1]==head0[1]): num += 1
135
+ # head0 = head
136
+
137
+ # head /= num
138
+
139
+ # if np.any(head) and np.any(left_shoulder) and np.any(left_elbow):
140
+ # left_arm_angle = calculate_angle(head, left_shoulder, left_elbow)
141
+ # else:
142
+ # left_arm_angle = 0
143
+
144
+ # if np.any(head) and np.any(right_shoulder) and np.any(right_elbow):
145
+ # right_arm_angle = calculate_angle(head, right_shoulder, right_elbow)
146
+ # else:
147
+ # right_arm_angle = 0
148
+
149
+ # if np.any(head) and np.any(left_shoulder) and np.any(left_hip):
150
+ # left_back_angle = calculate_angle(head, left_shoulder, left_hip)
151
+ # else:
152
+ # left_back_angle = 0
153
+
154
+ # if np.any(head) and np.any(right_shoulder) and np.any(right_hip):
155
+ # right_back_angle = calculate_angle(head, right_shoulder, right_hip)
156
+ # else:
157
+ # right_back_angle = 0
158
+ # ###############
159
+ # angles = {
160
+ # "left_elbow_angle": left_elbow_angle,
161
+ # "left_hip_angle": left_hip_angle,
162
+ # "right_elbow_angle": right_elbow_angle,
163
+ # "right_hip_angle": right_hip_angle,
164
+ # "left_arm_angle": left_arm_angle,
165
+ # "right_arm_angle": right_arm_angle,
166
+ # "left_back_angle": left_back_angle,
167
+ # "right_back_angle": right_back_angle,
168
+ # "left_knee_angle": left_knee_angle,
169
+ # "right_knee_angle": right_knee_angle
170
+ # }
171
+
172
+ # locations={
173
+ # "left_shoulder":left_shoulder,
174
+ # "left_elbow":left_elbow,
175
+ # "left_wrist":left_wrist,
176
+ # "right_shoulder":right_shoulder,
177
+ # "right_elbow":right_elbow,
178
+ # "right_wrist":right_wrist,
179
+
180
+ # "head":head,
181
+
182
+ # "left_hip":left_hip,
183
+ # "left_knee":left_knee,
184
+ # "left_ankle":left_ankle,
185
+
186
+ # "right_hip":right_hip,
187
+ # "right_knee":right_knee,
188
+ # "right_ankle":right_ankle
189
+ # }
190
+ # return angles,locations
191
+
192
+ # # Function to calculate the angles for both left and right sides and overlay on image
193
+ # def calculate_and_display_angles(image_path, return_angles=False):
194
+ # mp_pose = mp.solutions.pose
195
+ # pose = mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5)
196
+
197
+ # image = cv2.imread(image_path)
198
+ # image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
199
+
200
+ # # Get pose landmarks
201
+ # results = pose.process(image_rgb)
202
+
203
+ # if results.pose_landmarks:
204
+ # # landmarks = results.pose_landmarks
205
+ # ########
206
+ # ang , locs = calculate_angles_landmarks(results.pose_landmarks)
207
+
208
+ # #if only angles needed
209
+ # if return_angles:
210
+ # return ang
211
+
212
+ # # Draw the pose landmarks on the image
213
+ # mp_drawing = mp.solutions.drawing_utils
214
+ # mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
215
+
216
+ # # Display the angle values at corresponding locations
217
+ # def overlay_angle(angle, location, color=(0, 255, 0)):
218
+ # # Coordinates are normalized, scale them to the image size
219
+ # x = int(location[0] * image.shape[1])
220
+ # y = int(location[1] * image.shape[0])
221
+ # cv2.putText(image, f'{angle:.2f}', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.3, color, 1)
222
+
223
+ # # Overlay angles on the image
224
+ # if np.any(ang['left_elbow_angle']!=0):
225
+ # overlay_angle(ang['left_elbow_angle'], locs['left_elbow'], (0, 255, 0)) # Left elbow angle
226
+ # if np.any(ang['right_elbow_angle']!=0):
227
+ # overlay_angle(ang['right_elbow_angle'], locs['right_elbow'], (0, 255, 0)) # Right elbow angle
228
+ # if np.any(ang['left_hip_angle']!=0):
229
+ # overlay_angle(ang['left_hip_angle'], locs['left_hip'], (0, 255, 0)) # Left hip angle
230
+ # if np.any(ang['right_hip_angle']!=0):
231
+ # overlay_angle(ang['right_hip_angle'], locs['right_hip'], (0, 255, 0)) # Right hip angle
232
+ # if np.any(ang['left_arm_angle']!=0):
233
+ # overlay_angle(ang['left_arm_angle'], (locs['left_shoulder']
234
+ # + locs['left_elbow'])/2, (0, 255, 0)) # Left arm angle
235
+ # if np.any(ang['right_arm_angle']!=0):
236
+ # overlay_angle(ang['right_arm_angle'], (locs['right_shoulder']
237
+ # + locs['right_elbow'])/2, (0, 255, 0))
238
+ # if np.any(ang['left_back_angle']!=0):
239
+ # overlay_angle(ang['left_back_angle'], locs['left_shoulder'], (0, 255, 0)) # Left back angle
240
+ # if np.any(ang['right_back_angle']!=0):
241
+ # overlay_angle(ang['right_back_angle'], locs['right_shoulder'], (0, 255, 0)) # Right back angle
242
+
243
+ # if np.any(ang['left_knee_angle']!=0):
244
+ # overlay_angle(ang['left_knee_angle'], locs['left_knee'], (0, 255, 0)) # Left knee angle
245
+
246
+ # if np.any(ang['right_knee_angle']!=0):
247
+ # overlay_angle(ang['right_knee_angle'], locs['right_knee'], (0, 255, 0)) # Right knee angle
248
+
249
+ # # Return the image with the overlayed angles
250
+ # return image
251
+ # else:
252
+ # return None
253
+ # ###
254
+
255
+
256
+
257
+
258
+ ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
259
+ def allowed_file(filename):
260
+ return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
261
+ app = Flask(__name__)
262
+ # run_with_ngrok(app) # This will use ngrok for the server
263
+ public_url = ngrok.connect(5000)
264
+ print(" * ngrok tunnel:", public_url)
265
+
266
+ @app.route('/')
267
+ def hello():
268
+ return 'Hello, World!'
269
+
270
+ @app.route('/1', methods=['POST'])
271
+ def upload_file():
272
+ if 'image' not in request.files:
273
+ return {"message": "No file part"}, 400
274
+ file = request.files['image']
275
+ if file.filename == '':
276
+ return {"message": "No selected file"}, 400
277
+
278
+ # send file with angles on image or just angles
279
+ if file and allowed_file(file.filename):
280
+ try:
281
+ file.seek(0)
282
+ mime_type, _ = mimetypes.guess_type(file.filename)
283
+
284
+ return send_file(
285
+ BytesIO(file.read()), mimetype=mime_type,
286
+ as_attachment=False, download_name=file.filename
287
+ )
288
+
289
+ except Exception as e:
290
+ return {"message": f"Error processing file: {str(e)}"}, 500
291
+ return {"message": "File not allowed"}, 400
292
+
293
+
294
+ if __name__ == '__main__':
295
+ app.run()