ehsanhon commited on
Commit
afbab93
·
verified ·
1 Parent(s): b650cfd

Update app.py

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