ehsanhon commited on
Commit
c031f41
·
verified ·
1 Parent(s): 8bef8b1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +256 -1
app.py CHANGED
@@ -1,18 +1,272 @@
1
  from flask import Flask, request, send_file
2
  from io import BytesIO
3
  import mimetypes
 
 
 
 
4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
  #########################################
7
  ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
8
  def allowed_file(filename):
9
  return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
10
  app = Flask(__name__)
11
- ###########################################
12
  #############################################
13
  @app.route('/')
14
  def hello():
15
  return "This is my python code Adew"
 
16
  ########################################
17
  @app.route('/1', methods=['POST'])
18
  def upload_file():
@@ -36,6 +290,7 @@ def upload_file():
36
  except Exception as e:
37
  return {"message": f"Error processing file: {str(e)}"}, 500
38
  return {"message": "File not allowed"}, 400
 
39
  #####################################
40
  if __name__ == '__main__':
41
  app.run(host='0.0.0.0', port=7860)
 
1
  from flask import Flask, request, send_file
2
  from io import BytesIO
3
  import mimetypes
4
+ import cv2
5
+ import numpy as np
6
+ import mediapipe as mp
7
+ import math
8
 
9
+ ################
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
+ ################
64
+ mp_pose = mp.solutions.pose
65
+ pose = mp_pose.Pose(
66
+ static_image_mode=False,
67
+ model_complexity=1,
68
+ enable_segmentation=False,
69
+ min_detection_confidence=0.5,
70
+ min_tracking_confidence=0.5)
71
+ mp_drawing = mp.solutions.drawing_utils
72
+
73
+ ###########################
74
+ def calculate_angles_landmarks(landmarks):
75
+ # Left side angles
76
+ left_shoulder = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_SHOULDER)
77
+ left_elbow = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_ELBOW)
78
+ left_wrist = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_WRIST)
79
+ #
80
+ right_shoulder = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_SHOULDER)
81
+ right_elbow = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_ELBOW)
82
+ right_wrist = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_WRIST)
83
+ #
84
+ left_hip = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_HIP)
85
+ left_knee = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_KNEE)
86
+ #
87
+ right_hip = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_HIP)
88
+ right_knee = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_KNEE)
89
+ #
90
+ left_ankle = get_landmark_coordinates(landmarks,mp_pose.PoseLandmark.LEFT_ANKLE)
91
+ right_ankle = get_landmark_coordinates(landmarks,mp_pose.PoseLandmark.RIGHT_ANKLE)
92
+ #
93
+
94
+ if np.any(left_shoulder) and np.any(left_elbow) and np.any(left_wrist):
95
+ left_elbow_angle = calculate_angle(left_shoulder, left_elbow, left_wrist)
96
+ else: left_elbow_angle = 0
97
+
98
+ if np.any(left_shoulder) and np.any(left_hip) and np.any(left_knee):
99
+ left_hip_angle = calculate_angle(left_shoulder, left_hip, left_knee)
100
+ else: left_hip_angle = 0
101
+
102
+ if np.any(right_shoulder) and np.any(right_elbow) and np.any(right_wrist):
103
+ right_elbow_angle = calculate_angle(right_shoulder, right_elbow, right_wrist)
104
+ else: right_elbow_angle = 0
105
+
106
+ if np.any(right_shoulder) and np.any(right_hip) and np.any(right_knee):
107
+ right_hip_angle = calculate_angle(right_shoulder, right_hip, right_knee)
108
+ else: right_hip_angle = 0
109
+
110
+ if np.any(right_knee) and np.any(right_ankle) and np.any(right_hip):
111
+ right_knee_angle = calculate_angle(right_knee, right_ankle, right_hip)
112
+ else: right_knee_angle = 0
113
+
114
+ if np.any(left_knee) and np.any(left_ankle) and np.any(left_hip):
115
+ left_knee_angle = calculate_angle(left_knee, left_ankle, left_hip)
116
+ else: left_knee_angle = 0
117
+
118
+
119
+ # Additional angles (e.g., shoulders, knees, etc.)
120
+ head0 = 0
121
+ num = 0
122
+ head = get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.NOSE)
123
+ if not np.array_equal(head, head0): num += 1
124
+ head0 = head
125
+
126
+ head += get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_EYE)
127
+ if (head[0]==head0[0]) & (head[1]==head0[1]): num += 1
128
+ head0 = head
129
+
130
+ head += get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_EYE)
131
+ if (head[0]==head0[0]) & (head[1]==head0[1]): num += 1
132
+ head0 = head
133
+
134
+ head += get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.RIGHT_EAR)
135
+ if (head[0]==head0[0]) & (head[1]==head0[1]): num += 1
136
+ head0 = head
137
+
138
+ head += get_landmark_coordinates(landmarks, mp_pose.PoseLandmark.LEFT_EAR)
139
+ if (head[0]==head0[0]) & (head[1]==head0[1]): num += 1
140
+ head0 = head
141
+
142
+ head /= num
143
+
144
+ if np.any(head) and np.any(left_shoulder) and np.any(left_elbow):
145
+ left_arm_angle = calculate_angle(head, left_shoulder, left_elbow)
146
+ else:
147
+ left_arm_angle = 0
148
+
149
+ if np.any(head) and np.any(right_shoulder) and np.any(right_elbow):
150
+ right_arm_angle = calculate_angle(head, right_shoulder, right_elbow)
151
+ else:
152
+ right_arm_angle = 0
153
+
154
+ if np.any(head) and np.any(left_shoulder) and np.any(left_hip):
155
+ left_back_angle = calculate_angle(head, left_shoulder, left_hip)
156
+ else:
157
+ left_back_angle = 0
158
+
159
+ if np.any(head) and np.any(right_shoulder) and np.any(right_hip):
160
+ right_back_angle = calculate_angle(head, right_shoulder, right_hip)
161
+ else:
162
+ right_back_angle = 0
163
+ ###############
164
+ angles = {
165
+ "left_elbow_angle": left_elbow_angle,
166
+ "left_hip_angle": left_hip_angle,
167
+ "right_elbow_angle": right_elbow_angle,
168
+ "right_hip_angle": right_hip_angle,
169
+ "left_arm_angle": left_arm_angle,
170
+ "right_arm_angle": right_arm_angle,
171
+ "left_back_angle": left_back_angle,
172
+ "right_back_angle": right_back_angle,
173
+ "left_knee_angle": left_knee_angle,
174
+ "right_knee_angle": right_knee_angle
175
+ }
176
+
177
+ locations={
178
+ "left_shoulder":left_shoulder,
179
+ "left_elbow":left_elbow,
180
+ "left_wrist":left_wrist,
181
+ "right_shoulder":right_shoulder,
182
+ "right_elbow":right_elbow,
183
+ "right_wrist":right_wrist,
184
+
185
+ "head":head,
186
+
187
+ "left_hip":left_hip,
188
+ "left_knee":left_knee,
189
+ "left_ankle":left_ankle,
190
+
191
+ "right_hip":right_hip,
192
+ "right_knee":right_knee,
193
+ "right_ankle":right_ankle
194
+ }
195
+ return angles,locations
196
+
197
+ # Function to calculate the angles for both left and right sides and overlay on image
198
+ def calculate_and_display_angles(image_path, return_angles=False):
199
+ mp_pose = mp.solutions.pose
200
+ pose = mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5)
201
+
202
+ image = cv2.imread(image_path)
203
+ image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
204
+
205
+ # Get pose landmarks
206
+ results = pose.process(image_rgb)
207
+
208
+ if results.pose_landmarks:
209
+ # landmarks = results.pose_landmarks
210
+ ########
211
+ ang , locs = calculate_angles_landmarks(results.pose_landmarks)
212
+
213
+ #if only angles needed
214
+ if return_angles:
215
+ return ang
216
+
217
+ # Draw the pose landmarks on the image
218
+ mp_drawing = mp.solutions.drawing_utils
219
+ mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
220
+
221
+ # Display the angle values at corresponding locations
222
+ def overlay_angle(angle, location, color=(0, 255, 0)):
223
+ # Coordinates are normalized, scale them to the image size
224
+ x = int(location[0] * image.shape[1])
225
+ y = int(location[1] * image.shape[0])
226
+ cv2.putText(image, f'{angle:.2f}', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.3, color, 1)
227
+
228
+ # Overlay angles on the image
229
+ if np.any(ang['left_elbow_angle']!=0):
230
+ overlay_angle(ang['left_elbow_angle'], locs['left_elbow'], (0, 255, 0)) # Left elbow angle
231
+ if np.any(ang['right_elbow_angle']!=0):
232
+ overlay_angle(ang['right_elbow_angle'], locs['right_elbow'], (0, 255, 0)) # Right elbow angle
233
+ if np.any(ang['left_hip_angle']!=0):
234
+ overlay_angle(ang['left_hip_angle'], locs['left_hip'], (0, 255, 0)) # Left hip angle
235
+ if np.any(ang['right_hip_angle']!=0):
236
+ overlay_angle(ang['right_hip_angle'], locs['right_hip'], (0, 255, 0)) # Right hip angle
237
+ if np.any(ang['left_arm_angle']!=0):
238
+ overlay_angle(ang['left_arm_angle'], (locs['left_shoulder']
239
+ + locs['left_elbow'])/2, (0, 255, 0)) # Left arm angle
240
+ if np.any(ang['right_arm_angle']!=0):
241
+ overlay_angle(ang['right_arm_angle'], (locs['right_shoulder']
242
+ + locs['right_elbow'])/2, (0, 255, 0))
243
+ if np.any(ang['left_back_angle']!=0):
244
+ overlay_angle(ang['left_back_angle'], locs['left_shoulder'], (0, 255, 0)) # Left back angle
245
+ if np.any(ang['right_back_angle']!=0):
246
+ overlay_angle(ang['right_back_angle'], locs['right_shoulder'], (0, 255, 0)) # Right back angle
247
+
248
+ if np.any(ang['left_knee_angle']!=0):
249
+ overlay_angle(ang['left_knee_angle'], locs['left_knee'], (0, 255, 0)) # Left knee angle
250
+
251
+ if np.any(ang['right_knee_angle']!=0):
252
+ overlay_angle(ang['right_knee_angle'], locs['right_knee'], (0, 255, 0)) # Right knee angle
253
+
254
+ # Return the image with the overlayed angles
255
+ return image
256
+ else:
257
+ return None
258
 
259
  #########################################
260
  ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
261
  def allowed_file(filename):
262
  return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
263
  app = Flask(__name__)
264
+
265
  #############################################
266
  @app.route('/')
267
  def hello():
268
  return "This is my python code Adew"
269
+
270
  ########################################
271
  @app.route('/1', methods=['POST'])
272
  def upload_file():
 
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(host='0.0.0.0', port=7860)