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

Upload 3 files

Browse files
Files changed (3) hide show
  1. Dockerfile +9 -1
  2. app.py +296 -295
  3. requirements.txt +0 -0
Dockerfile CHANGED
@@ -14,14 +14,22 @@ RUN wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip && \
14
  chmod +x /usr/local/bin/ngrok && \
15
  rm ngrok-stable-linux-amd64.zip
16
 
17
- # Set matplotlib config dir to avoid permission issues
18
  ENV MPLCONFIGDIR=/tmp/matplotlib
 
19
 
 
20
  WORKDIR /app
 
 
21
  COPY requirements.txt requirements.txt
22
  RUN pip install --no-cache-dir -r requirements.txt
 
 
23
  COPY . .
24
 
 
25
  EXPOSE 7860
26
 
 
27
  CMD ["python", "app.py"]
 
14
  chmod +x /usr/local/bin/ngrok && \
15
  rm ngrok-stable-linux-amd64.zip
16
 
17
+ # Set config dirs to avoid permission issues
18
  ENV MPLCONFIGDIR=/tmp/matplotlib
19
+ ENV PYNGROK_CONFIG_DIR=/tmp/pyngrok
20
 
21
+ # Working directory
22
  WORKDIR /app
23
+
24
+ # Install Python dependencies
25
  COPY requirements.txt requirements.txt
26
  RUN pip install --no-cache-dir -r requirements.txt
27
+
28
+ # Copy source files
29
  COPY . .
30
 
31
+ # Expose the Flask port
32
  EXPOSE 7860
33
 
34
+ # Start the app
35
  CMD ["python", "app.py"]
app.py CHANGED
@@ -1,295 +1,296 @@
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()
 
 
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()
requirements.txt CHANGED
Binary files a/requirements.txt and b/requirements.txt differ