File size: 3,814 Bytes
f2d8d0d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
from flask import Flask, render_template, request, jsonify, send_from_directory
from flask_socketio import SocketIO
from flask_cors import CORS
import mediapipe as mp
import cv2
import numpy as np
import time
import os
import json

app = Flask(__name__)
socketio = SocketIO(app)
CORS(app)

mp_pose = mp.solutions.pose
pose = mp_pose.Pose(static_image_mode=False, min_detection_confidence=0.5, min_tracking_confidence=0.5)

@app.route('/')
def index():
    return render_template('index.html')

def process_video(video_path):
    cap = cv2.VideoCapture(video_path)
    frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    fps = int(cap.get(cv2.CAP_PROP_FPS))
    
    all_results = []
    previous_keypoints = None
    previous_velocities = None
    previous_time = 0
    
    for frame_number in range(frame_count):
        success, frame = cap.read()
        if not success:
            break
        
        frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        results = pose.process(frame_rgb)
        
        if results.pose_landmarks:
            landmarks = results.pose_landmarks.landmark
            keypoints = [(lm.x, lm.y, lm.z) for lm in landmarks]
            current_time = frame_number / fps
            delta_time = current_time - previous_time
            
            velocities = []
            accelerations = []
            
            if previous_keypoints:
                for i, lm in enumerate(landmarks):
                    dx = lm.x - previous_keypoints[i][0]
                    dy = lm.y - previous_keypoints[i][1]
                    dz = lm.z - previous_keypoints[i][2]
                    speed = np.sqrt(dx ** 2 + dy ** 2 + dz ** 2) / delta_time if delta_time > 0 else 0
                    velocities.append(speed)
                    acceleration = (speed - previous_velocities[i]) / delta_time if previous_velocities and delta_time > 0 else 0
                    accelerations.append(acceleration)
            
            all_results.append({
                'frame': frame_number,
                'landmarks': keypoints,
                'velocities': velocities,
                'accelerations': accelerations
            })
            
            previous_keypoints = keypoints
            previous_velocities = velocities
            previous_time = current_time
    
    cap.release()
    return all_results, fps

@app.route('/upload_video', methods=['POST'])
def upload_video():
    file = request.files.get('video')
    if file:
        upload_folder = os.path.join(app.root_path, 'static', 'uploads')
        if not os.path.exists(upload_folder):
            os.makedirs(upload_folder)
        video_path = os.path.join(upload_folder, 'temp_video.mp4')
        file.save(video_path)
        
        results, fps = process_video(video_path)
        
        results_path = os.path.join(upload_folder, 'results.json')
        with open(results_path, 'w') as f:
            json.dump({'results': results, 'fps': fps}, f)
        
        return jsonify(success=True, message='Video processed successfully')
    return jsonify(success=False, message='No video file received'), 400

@app.route('/get_results')
def get_results():
    results_path = os.path.join(app.root_path, 'static', 'uploads', 'results.json')
    if os.path.exists(results_path):
        with open(results_path, 'r') as f:
            return jsonify(json.load(f))
    return jsonify(success=False, message='Results not found'), 404

@app.route('/uploads/<path:filename>')
def serve_upload(filename):
    return send_from_directory(os.path.join(app.root_path, 'static', 'uploads'), filename)

if __name__ == '__main__':
    os.makedirs(os.path.join(app.root_path, 'static', 'uploads'), exist_ok=True)
    socketio.run(app, host='0.0.0.0', port=7860, debug=True, allow_unsafe_werkzeug=True)