mistpe commited on
Commit
f2d8d0d
·
verified ·
1 Parent(s): 3a65c9b

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +114 -0
app.py ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, render_template, request, jsonify, send_from_directory
2
+ from flask_socketio import SocketIO
3
+ from flask_cors import CORS
4
+ import mediapipe as mp
5
+ import cv2
6
+ import numpy as np
7
+ import time
8
+ import os
9
+ import json
10
+
11
+ app = Flask(__name__)
12
+ socketio = SocketIO(app)
13
+ CORS(app)
14
+
15
+ mp_pose = mp.solutions.pose
16
+ pose = mp_pose.Pose(static_image_mode=False, min_detection_confidence=0.5, min_tracking_confidence=0.5)
17
+
18
+ @app.route('/')
19
+ def index():
20
+ return render_template('index.html')
21
+
22
+ @app.route('/web_app')
23
+ def web_app():
24
+ return render_template('holistic.html')
25
+
26
+ @app.route('/video_app')
27
+ def video_app():
28
+ return render_template('video_app.html')
29
+
30
+ def process_video(video_path):
31
+ cap = cv2.VideoCapture(video_path)
32
+ frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
33
+ fps = int(cap.get(cv2.CAP_PROP_FPS))
34
+
35
+ all_results = []
36
+ previous_keypoints = None
37
+ previous_velocities = None
38
+ previous_time = 0
39
+
40
+ for frame_number in range(frame_count):
41
+ success, frame = cap.read()
42
+ if not success:
43
+ break
44
+
45
+ frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
46
+ results = pose.process(frame_rgb)
47
+
48
+ if results.pose_landmarks:
49
+ landmarks = results.pose_landmarks.landmark
50
+ keypoints = [(lm.x, lm.y, lm.z) for lm in landmarks]
51
+ current_time = frame_number / fps
52
+ delta_time = current_time - previous_time
53
+
54
+ velocities = []
55
+ accelerations = []
56
+
57
+ if previous_keypoints:
58
+ for i, lm in enumerate(landmarks):
59
+ dx = lm.x - previous_keypoints[i][0]
60
+ dy = lm.y - previous_keypoints[i][1]
61
+ dz = lm.z - previous_keypoints[i][2]
62
+ speed = np.sqrt(dx ** 2 + dy ** 2 + dz ** 2) / delta_time if delta_time > 0 else 0
63
+ velocities.append(speed)
64
+ acceleration = (speed - previous_velocities[i]) / delta_time if previous_velocities and delta_time > 0 else 0
65
+ accelerations.append(acceleration)
66
+
67
+ all_results.append({
68
+ 'frame': frame_number,
69
+ 'landmarks': keypoints,
70
+ 'velocities': velocities,
71
+ 'accelerations': accelerations
72
+ })
73
+
74
+ previous_keypoints = keypoints
75
+ previous_velocities = velocities
76
+ previous_time = current_time
77
+
78
+ cap.release()
79
+ return all_results, fps
80
+
81
+ @app.route('/upload_video', methods=['POST'])
82
+ def upload_video():
83
+ file = request.files.get('video')
84
+ if file:
85
+ upload_folder = os.path.join(app.root_path, 'static', 'uploads')
86
+ if not os.path.exists(upload_folder):
87
+ os.makedirs(upload_folder)
88
+ video_path = os.path.join(upload_folder, 'temp_video.mp4')
89
+ file.save(video_path)
90
+
91
+ results, fps = process_video(video_path)
92
+
93
+ results_path = os.path.join(upload_folder, 'results.json')
94
+ with open(results_path, 'w') as f:
95
+ json.dump({'results': results, 'fps': fps}, f)
96
+
97
+ return jsonify(success=True, message='Video processed successfully')
98
+ return jsonify(success=False, message='No video file received'), 400
99
+
100
+ @app.route('/get_results')
101
+ def get_results():
102
+ results_path = os.path.join(app.root_path, 'static', 'uploads', 'results.json')
103
+ if os.path.exists(results_path):
104
+ with open(results_path, 'r') as f:
105
+ return jsonify(json.load(f))
106
+ return jsonify(success=False, message='Results not found'), 404
107
+
108
+ @app.route('/uploads/<path:filename>')
109
+ def serve_upload(filename):
110
+ return send_from_directory(os.path.join(app.root_path, 'static', 'uploads'), filename)
111
+
112
+ if __name__ == '__main__':
113
+ os.makedirs(os.path.join(app.root_path, 'static', 'uploads'), exist_ok=True)
114
+ socketio.run(app, host='0.0.0.0', port=7860, debug=True, allow_unsafe_werkzeug=True)