|
|
@@ -1,10 +1,8 @@
|
|
|
-import math
|
|
|
-import os
|
|
|
+import pickle
|
|
|
from typing import Callable
|
|
|
from config import UPLOAD_DIR
|
|
|
import cv2
|
|
|
import logging
|
|
|
-import numpy as np
|
|
|
|
|
|
from service.aiutil.torch_openpose import torch_openpose
|
|
|
from service.aiutil.util import draw_bodypose
|
|
|
@@ -12,10 +10,6 @@ from service.aiutil.util import draw_bodypose
|
|
|
|
|
|
def run_openpose_for_npy_and_video(video_uuid):
|
|
|
video_path = UPLOAD_DIR + video_uuid + ".mp4"
|
|
|
- frames_dir = UPLOAD_DIR + "frames/" + video_uuid + "/"
|
|
|
-
|
|
|
- if not os.path.exists(frames_dir): # Already split
|
|
|
- os.makedirs(frames_dir)
|
|
|
|
|
|
cap = cv2.VideoCapture(video_path)
|
|
|
FPS = cap.get(5) # 5 means fps
|
|
|
@@ -27,23 +21,22 @@ def run_openpose_for_npy_and_video(video_uuid):
|
|
|
|
|
|
tp = torch_openpose('body_25') # AI Model
|
|
|
|
|
|
+ results = {}
|
|
|
+
|
|
|
while True:
|
|
|
ret, frame = cap.read()
|
|
|
if ret:
|
|
|
if c % sampling_fps == 0:
|
|
|
-
|
|
|
- # if os.path.exists(frames_dir + str(c) + ".npy"):
|
|
|
- # continue
|
|
|
-
|
|
|
logging.debug("Running openpose for %s %s" % (video_uuid, c))
|
|
|
|
|
|
poses = tp(frame)
|
|
|
- np.save(frames_dir + str(c) + ".npy", poses)
|
|
|
+ results[c] = poses
|
|
|
|
|
|
canvas = draw_bodypose(frame, poses, 'body_25')
|
|
|
|
|
|
if out is None:
|
|
|
- out = cv2.VideoWriter(frames_dir + "result.mp4", cv2.VideoWriter_fourcc(*"mp4v"), FPS, (canvas.shape[1], canvas.shape[0])) # So fucking stupid
|
|
|
+ out = cv2.VideoWriter(UPLOAD_DIR + video_uuid + ".result.mp4", cv2.VideoWriter_fourcc(*"mp4v"), FPS,
|
|
|
+ (canvas.shape[1], canvas.shape[0])) # So fucking stupid
|
|
|
out.write(canvas)
|
|
|
|
|
|
c += 1
|
|
|
@@ -53,10 +46,13 @@ def run_openpose_for_npy_and_video(video_uuid):
|
|
|
cap.release()
|
|
|
out.release()
|
|
|
|
|
|
+ return results
|
|
|
+
|
|
|
|
|
|
class BaseVideoAnalyzer:
|
|
|
def __init__(self, data: dict):
|
|
|
self.video_uuid = data['video_uuid']
|
|
|
+ self.results = None
|
|
|
|
|
|
def _do_analyze(self):
|
|
|
assert False, "Internal error: You should override this with a subclass!"
|
|
|
@@ -64,327 +60,78 @@ class BaseVideoAnalyzer:
|
|
|
def analyze(self, callback: Callable):
|
|
|
try:
|
|
|
callback("RUNNING")
|
|
|
- run_openpose_for_npy_and_video(self.video_uuid)
|
|
|
+ self.results = run_openpose_for_npy_and_video(self.video_uuid)
|
|
|
+ pickle.dump(self.results, open(UPLOAD_DIR + self.video_uuid + ".dump", "wb"))
|
|
|
+
|
|
|
callback("FINISHED", result=self._do_analyze())
|
|
|
except Exception as e:
|
|
|
callback("ERROR", error=e)
|
|
|
raise e
|
|
|
|
|
|
|
|
|
-def angle1(v1, v2):
|
|
|
- dx1 = v1[2] - v1[0]
|
|
|
- dy1 = v1[3] - v1[1]
|
|
|
- angle1 = float(math.atan2(dy1, dx1))
|
|
|
- angle2 = abs(round(angle1 * 180.0 / math.pi, 2))
|
|
|
- return angle2
|
|
|
-
|
|
|
-
|
|
|
-# calculate the angle between 3 points under the coordinates
|
|
|
-# params: list, item [x,y]
|
|
|
-# return: the angle value of b
|
|
|
-def cal_angle(point_a, point_b, point_c):
|
|
|
- a_x, b_x, c_x = point_a[0], point_b[0], point_c[0]
|
|
|
- a_y, b_y, c_y = point_a[1], point_b[1], point_c[1]
|
|
|
- a_z, b_z, c_z = 0, 0, 0
|
|
|
- # m=(x1,y1,z1), n=(x2,y2,z2)
|
|
|
- x1, y1, z1 = (a_x - b_x), (a_y - b_y), (a_z - b_z)
|
|
|
- x2, y2, z2 = (c_x - b_x), (c_y - b_y), (c_z - b_z)
|
|
|
-
|
|
|
- cos_b = (x1 * x2 + y1 * y2 + z1 * z2) / (
|
|
|
- math.sqrt(x1 ** 2 + y1 ** 2 + z1 ** 2) * (math.sqrt(x2 ** 2 + y2 ** 2 + z2 ** 2)))
|
|
|
- B = math.degrees(math.acos(cos_b))
|
|
|
- return round(B, 2)
|
|
|
-
|
|
|
-
|
|
|
-def analyse_npy_crunch_side(data):
|
|
|
- result = {}
|
|
|
-
|
|
|
- print(len(data))
|
|
|
- assert len(data) == 25, "error"
|
|
|
-
|
|
|
- nose_x = data[0][0]
|
|
|
- nose_y = data[0][1]
|
|
|
- shoulder_r_x = data[2][0]
|
|
|
- shoulder_r_y = data[2][1]
|
|
|
- elbow_r_x = data[3][0]
|
|
|
- elbow_r_y = data[3][1]
|
|
|
- wrist_r_x = data[4][0]
|
|
|
- wrist_r_y = data[4][1]
|
|
|
-
|
|
|
- hip_r_x = data[9][0]
|
|
|
- hip_r_y = data[9][1]
|
|
|
- knee_r_x = data[10][0]
|
|
|
- knee_r_y = data[10][1]
|
|
|
- neck_x = data[1][0]
|
|
|
- neck_y = data[1][1]
|
|
|
- ankle_r_x = data[11][0]
|
|
|
- ankle_r_y = data[11][1]
|
|
|
- leg_heigh = data[11][1]
|
|
|
- neck_hip_angle = round(angle1([neck_x, neck_y, hip_r_x, hip_r_y], [0, 0, 0, -1]), 2)
|
|
|
- nose_neck_angle = round(angle1([nose_x, nose_y, neck_x, neck_y], [0, 0, 0, -1]), 2)
|
|
|
- hip_knee_angle = round(angle1([hip_r_x, hip_r_y, knee_r_x, knee_r_y], [0, 0, 0, -1]), 2)
|
|
|
- knee_ankle_angle = round(angle1([knee_r_x, knee_r_y, ankle_r_x, ankle_r_y], [0, 0, 0, -1]), 2)
|
|
|
- result["neck_hip_angle"] = neck_hip_angle
|
|
|
- result["nose_neck_angle"] = nose_neck_angle
|
|
|
- result["hip_knee_angle"] = hip_knee_angle
|
|
|
- result["knee_ankle_angle"] = knee_ankle_angle
|
|
|
- return result
|
|
|
-
|
|
|
-
|
|
|
-def analyse_npy_side_pingban(data):
|
|
|
- result = {}
|
|
|
- assert len(data) >= 15, "error"
|
|
|
-
|
|
|
- shoulder_r_x = data[2][0]
|
|
|
- shoulder_r_y = data[2][1]
|
|
|
- elbow_r_x = data[3][0]
|
|
|
- elbow_r_y = data[3][1]
|
|
|
- wrist_r_x = data[4][0]
|
|
|
- wrist_r_y = data[4][1]
|
|
|
-
|
|
|
- hip_r_x = data[9][0]
|
|
|
- hip_r_y = data[9][1]
|
|
|
- knee_r_x = data[10][0]
|
|
|
- knee_r_y = data[10][1]
|
|
|
- neck_x = data[1][0]
|
|
|
- neck_y = data[1][1]
|
|
|
- ankle_r_x = data[11][0]
|
|
|
- ankle_r_y = data[11][1]
|
|
|
- bigToe_r_x = data[22][0]
|
|
|
- bigToe_r_y = data[22][1]
|
|
|
- knee_ankle_angle = round(angle1([knee_r_x, knee_r_y, ankle_r_x, ankle_r_y], [0, 0, 0, -1]), 2)
|
|
|
- leg_heigh = data[11][1]
|
|
|
- neck_hip_angle = round(angle1([neck_x, neck_y, hip_r_x, hip_r_y], [0, 0, 0, -1]), 2)
|
|
|
- hip_knee_angle = round(angle1([hip_r_x, hip_r_y, knee_r_x, knee_r_y], [0, 0, 0, -1]), 2)
|
|
|
- s_e_angle = round(angle1([shoulder_r_x, shoulder_r_y, elbow_r_x, elbow_r_y], []), 2)
|
|
|
- e_w_angle = round(angle1([elbow_r_x, elbow_r_y, wrist_r_x, wrist_r_y], []), 2)
|
|
|
- hip_heigh = hip_r_y
|
|
|
-
|
|
|
- result["knee_ankle_angle"] = knee_ankle_angle
|
|
|
- result["leg_heigh"] = leg_heigh
|
|
|
- result["neck_hip_angle"] = neck_hip_angle
|
|
|
- result["hip_knee_angle"] = hip_knee_angle
|
|
|
- result["hip_heigh"] = hip_heigh
|
|
|
- result["s_e_angle"] = s_e_angle
|
|
|
- result["e_w_angle"] = e_w_angle
|
|
|
-
|
|
|
- # print(npy_side)
|
|
|
- return result
|
|
|
-
|
|
|
-
|
|
|
-def analyse_npy_side_jump(data):
|
|
|
- result = {}
|
|
|
-
|
|
|
- assert len(data) == 25, "error"
|
|
|
-
|
|
|
- # should-elbow-wrist r2-3-4 l5-6-7
|
|
|
- # neck-hip-knee r1-9-10 l1-12-13
|
|
|
- # hip-knee-ankle r9-10-11 l12-13-14
|
|
|
- # knee-ankle-bigToe r10-11-22 l13-14-19
|
|
|
- result["elbow_right_angle"] = cal_angle(data[2], data[3], data[4])
|
|
|
- result["elbow_left_angle"] = cal_angle(data[5], data[6], data[7])
|
|
|
- result["hip_right_angle"] = cal_angle(data[1], data[9], data[10])
|
|
|
- result["hip_left_angle"] = cal_angle(data[1], data[12], data[13])
|
|
|
- result["knee_right_angle"] = cal_angle(data[9], data[10], data[11])
|
|
|
- result["knee_left_angle"] = cal_angle(data[12], data[13], data[14])
|
|
|
- result["ankle_right_angle"] = cal_angle(data[10], data[11], data[12])
|
|
|
- result["ankle_left_angle"] = cal_angle(data[13], data[14], data[19])
|
|
|
- result["leg_heigh"] = data[11][1] # ankle
|
|
|
- result["hip_heigh"] = data[9][1] # hip
|
|
|
- result["wrist_heigh"] = data[4][1]
|
|
|
- result["neck_heigh"] = data[1][1]
|
|
|
-
|
|
|
- # knee_ankle_angle = round(angle1([knee_r_x, knee_r_y, ankle_r_x, ankle_r_y], [0, 0, 0, -1]), 2)
|
|
|
- # neck_hip_angle = round(angle1([neck_x, neck_y, hip_r_x, hip_r_y], [0, 0, 0, -1]), 2)
|
|
|
- # hip_knee_angle = round(angle1([hip_r_x, hip_r_y, knee_r_x, knee_r_y], [0, 0, 0, -1]), 2)
|
|
|
- # hip_heigh = hip_r_y
|
|
|
- # result["knee_ankle_angle"] = knee_ankle_angle
|
|
|
- # result["leg_heigh"] = leg_heigh
|
|
|
- # result["neck_hip_angle"] = neck_hip_angle
|
|
|
- # result["hip_knee_angle"] = hip_knee_angle
|
|
|
- # result["hip_heigh"] = hip_heigh
|
|
|
-
|
|
|
- return result
|
|
|
-
|
|
|
-
|
|
|
-def analyse_npy_side_gaotaitui(data):
|
|
|
- result = {}
|
|
|
-
|
|
|
- assert len(data) == 25, "error"
|
|
|
- # print(data)
|
|
|
- hip_r_x = data[9][0]
|
|
|
- hip_r_y = data[9][1]
|
|
|
- knee_r_x = data[10][0]
|
|
|
- knee_r_y = data[10][1]
|
|
|
-
|
|
|
- hip_l_x = data[12][0]
|
|
|
- hip_l_y = data[12][1]
|
|
|
- knee_l_x = data[13][0]
|
|
|
- knee_l_y = data[13][1]
|
|
|
- # print(head_forward_level)
|
|
|
- # upper part of body
|
|
|
- up_risk_level = ""
|
|
|
- up_state = ""
|
|
|
- neck_x = data[1][0]
|
|
|
- neck_y = data[1][1]
|
|
|
- ankle_r_x = data[11][0]
|
|
|
- ankle_r_y = data[11][1]
|
|
|
- ankle_l_x = data[14][0]
|
|
|
- ankle_l_y = data[14][1]
|
|
|
- knee_ankle_r_angle = round(angle1([knee_r_x, knee_r_y, ankle_r_x, ankle_r_y], [0, 0, 0, -1]), 2) # ϥ�ǵ���
|
|
|
- knee_ankle_l_angle = round(angle1([knee_l_x, knee_l_y, ankle_l_x, ankle_l_y], [0, 0, 0, -1]), 2) # ϥ�ǵ���
|
|
|
-
|
|
|
- hip_knee_r_angle = round(angle1([hip_r_x, hip_r_y, knee_r_x, knee_r_y], [0, 0, 0, -1]), 2)
|
|
|
- hip_knee_l_angle = round(angle1([hip_l_x, hip_l_y, knee_l_x, knee_l_y], [0, 0, 0, -1]), 2)
|
|
|
- neck_hip_angle = round(angle1([neck_x, neck_y, hip_r_x, hip_r_y], [0, 0, 0, -1]), 2)
|
|
|
- # hip_knee_angle=round(angle1([hip_r_x, hip_r_y,knee_r_x, knee_r_y], [0, 0, 0, -1]), 2)
|
|
|
- hip_heigh = hip_r_y
|
|
|
-
|
|
|
- result["knee_ankle_r_angle"] = knee_ankle_r_angle
|
|
|
- result["knee_ankle_l_angle"] = knee_ankle_l_angle
|
|
|
- result["hip_knee_r_angle"] = hip_knee_r_angle
|
|
|
- result["hip_knee_l_angle"] = hip_knee_l_angle
|
|
|
- result["r_d"] = abs(0 - float(hip_knee_r_angle) + float(knee_ankle_r_angle))
|
|
|
- result["l_d"] = abs(0 + float(knee_ankle_l_angle) - float(hip_knee_l_angle))
|
|
|
- return result
|
|
|
-
|
|
|
-
|
|
|
-def analyse_npy_side_shendun(data):
|
|
|
- result = {}
|
|
|
- assert len(data) == 25, "data length must be 25."
|
|
|
- hip_r_x = data[9][0]
|
|
|
- hip_r_y = data[9][1]
|
|
|
- knee_r_x = data[10][0]
|
|
|
- knee_r_y = data[10][1]
|
|
|
-
|
|
|
- hip_l_x = data[12][0]
|
|
|
- hip_l_y = data[12][1]
|
|
|
- knee_l_x = data[13][0]
|
|
|
- knee_l_y = data[13][1]
|
|
|
- # print(head_forward_level)
|
|
|
- # upper part of body
|
|
|
- up_risk_level = ""
|
|
|
- up_state = ""
|
|
|
- neck_x = data[1][0]
|
|
|
- neck_y = data[1][1]
|
|
|
- ankle_r_x = data[11][0]
|
|
|
- ankle_r_y = data[11][1]
|
|
|
- ankle_l_x = data[14][0]
|
|
|
- ankle_l_y = data[14][1]
|
|
|
- knee_ankle_r_angle = round(angle1([knee_r_x, knee_r_y, ankle_r_x, ankle_r_y], [0, 0, 0, -1]), 2)
|
|
|
- knee_ankle_l_angle = round(angle1([knee_l_x, knee_l_y, ankle_l_x, ankle_l_y], [0, 0, 0, -1]), 2)
|
|
|
-
|
|
|
- hip_knee_r_angle = round(angle1([hip_r_x, hip_r_y, knee_r_x, knee_r_y], [0, 0, 0, -1]), 2)
|
|
|
- hip_knee_l_angle = round(angle1([hip_l_x, hip_l_y, knee_l_x, knee_l_y], [0, 0, 0, -1]), 2)
|
|
|
- neck_hip_angle = round(angle1([neck_x, neck_y, hip_r_x, hip_r_y], [0, 0, 0, -1]), 2)
|
|
|
- # hip_knee_angle=round(angle1([hip_r_x, hip_r_y,knee_r_x, knee_r_y], [0, 0, 0, -1]), 2)
|
|
|
- hip_heigh = hip_r_y
|
|
|
-
|
|
|
- result["knee_ankle_r_angle"] = knee_ankle_r_angle
|
|
|
- result["knee_ankle_l_angle"] = knee_ankle_l_angle
|
|
|
- result["hip_knee_r_angle"] = hip_knee_r_angle
|
|
|
- result["hip_knee_l_angle"] = hip_knee_l_angle
|
|
|
- result["r_d"] = abs(float(result["hip_knee_r_angle"]) - float(result["knee_ankle_r_angle"]))
|
|
|
-
|
|
|
- return result
|
|
|
-
|
|
|
-
|
|
|
-def ignore_data_jump(result_ig: dict):
|
|
|
- max_index = max(result_ig.keys())
|
|
|
- min_index = min(result_ig.keys())
|
|
|
-
|
|
|
- max_leg_knee_angle = result_ig[min_index]["knee_ankle_angle"]
|
|
|
- max_leg_knee_angle_num = int(min_index)
|
|
|
- less_angle = 100
|
|
|
- less_num = 1
|
|
|
- ankle = result_ig[min_index]["leg_heigh"]
|
|
|
- max_leg_knee_hip_knee = math.fabs(
|
|
|
- float(result_ig[min_index]["hip_knee_angle"]) - float(result_ig[min_index]["knee_ankle_angle"]))
|
|
|
- max_l_h_num = 1
|
|
|
- hip_hei_init = float(result_ig[min_index]["hip_heigh"])
|
|
|
- # print("max")
|
|
|
- # print(max_index)
|
|
|
- # print(hip_hei_init)
|
|
|
-
|
|
|
- for i in result_ig:
|
|
|
- if int(i) <= max_index / 5:
|
|
|
- if float(max_leg_knee_angle) < float(result_ig[i]["knee_ankle_angle"]):
|
|
|
- max_leg_knee_angle_num = int(i)
|
|
|
- max_leg_knee_angle = result_ig[i]["knee_ankle_angle"]
|
|
|
- if int(i) <= max_index / 2 and int(i) > max_index / 3:
|
|
|
- val = math.fabs(
|
|
|
- math.fabs(float(result_ig[i]["hip_knee_angle"])) - math.fabs(float(result_ig[i]["knee_ankle_angle"])))
|
|
|
- if (math.fabs(math.fabs(float(result_ig[i]["hip_knee_angle"])) - math.fabs(
|
|
|
- float(result_ig[i]["knee_ankle_angle"]))) < less_angle):
|
|
|
- less_angle = val
|
|
|
- less_num = int(i)
|
|
|
-
|
|
|
- if int(i) <= max_index and int(i) > (max_index / 3):
|
|
|
-
|
|
|
- if (float(result_ig[i]["hip_heigh"])) < (float(hip_hei_init)) and max_l_h_num != 1:
|
|
|
- break
|
|
|
- if (math.fabs(math.fabs(float(result_ig[i]["hip_knee_angle"])) - math.fabs(
|
|
|
- float(result_ig[i]["knee_ankle_angle"])))) > max_leg_knee_hip_knee and math.fabs(
|
|
|
- float(result_ig[i]["leg_heigh"]) - float(ankle)) <= 20:
|
|
|
- max_leg_knee_hip_knee = math.fabs(
|
|
|
- float(result_ig[i]["hip_knee_angle"]) - math.fabs(float(result_ig[i]["knee_ankle_angle"])))
|
|
|
- max_l_h_num = int(i)
|
|
|
-
|
|
|
- # ankle=result_ig[i]["leg_heigh"]
|
|
|
- # ankle_num=int(i)
|
|
|
- # elif ankle!=1 and int(i)>=(le/3*2):
|
|
|
- # break
|
|
|
-
|
|
|
- print(max_leg_knee_angle)
|
|
|
- print(max_leg_knee_angle_num)
|
|
|
- print(less_num)
|
|
|
- print(less_angle)
|
|
|
- # print(ankle)
|
|
|
- # print(ankle_num)
|
|
|
- print(max_leg_knee_hip_knee)
|
|
|
- print(max_l_h_num)
|
|
|
- re = {}
|
|
|
- re["1"] = {}
|
|
|
- re["1"]["num"] = max_leg_knee_angle_num
|
|
|
- re["1"]["val"] = max_leg_knee_angle
|
|
|
- re["2"] = {}
|
|
|
- re["2"]["num"] = less_num
|
|
|
- re["2"]["val"] = less_angle
|
|
|
- re["3"] = {}
|
|
|
- re["3"]["num"] = max_l_h_num
|
|
|
- re["3"]["val"] = max_leg_knee_hip_knee
|
|
|
- print(re)
|
|
|
-
|
|
|
- return re
|
|
|
-
|
|
|
-
|
|
|
-class HighKneesVideoAnalyzer(BaseVideoAnalyzer):
|
|
|
+from video_score.jump import cal_jump
|
|
|
+from video_score.pingban import cal_pingban
|
|
|
+from video_score.turnaround import cal_turnaround
|
|
|
+from video_score.tennisthrow import cal_tennisthrow
|
|
|
+from video_score.jumpwithboth import cal_jumpwithboth
|
|
|
+from video_score.standing import cal_standing
|
|
|
+from video_score.balancebeam import cal_balancebeam
|
|
|
+from video_score.sitforward import cal_sitforward
|
|
|
+
|
|
|
+from video_score.juanfu import ignore_data_juanfu
|
|
|
+from video_score.shendun import ignore_data_shendun
|
|
|
+from video_score.gaotaitui import ignore_data_gaotaitui
|
|
|
+
|
|
|
+class JumpAnalyzer(BaseVideoAnalyzer):
|
|
|
+ def _do_analyze(self):
|
|
|
+ return {"data": cal_jump(self.results)[1], "advice": "AI组说还没写完"}
|
|
|
+
|
|
|
+
|
|
|
+class PingbanAnalyzer(BaseVideoAnalyzer):
|
|
|
+ def _do_analyze(self):
|
|
|
+ return {"data": cal_pingban(self.results)[1], "advice": "AI组说还没写完"}
|
|
|
+
|
|
|
+
|
|
|
+class JuanfuAnalyzer(BaseVideoAnalyzer):
|
|
|
+ def _do_analyze(self):
|
|
|
+ return {"data": ignore_data_juanfu(self.results)[1], "advice": "AI组说还没写完"}
|
|
|
+
|
|
|
+
|
|
|
+class ShendunAnalyzer(BaseVideoAnalyzer):
|
|
|
+ def _do_analyze(self):
|
|
|
+ return {"data": ignore_data_shendun(self.results)[1], "advice": "AI组说还没写完"}
|
|
|
+
|
|
|
+
|
|
|
+class GaotaituiAnalyzer(BaseVideoAnalyzer):
|
|
|
+ def _do_analyze(self):
|
|
|
+ return {"data": ignore_data_gaotaitui(self.results)[1], "advice": "AI组说还没写完"}
|
|
|
+
|
|
|
+
|
|
|
+class TrunaroundAnalyzer(BaseVideoAnalyzer):
|
|
|
+ def _do_analyze(self):
|
|
|
+ return {"data": cal_turnaround(self.results)[1], "advice": "AI组说还没写完"}
|
|
|
+
|
|
|
+
|
|
|
+class TennisthrowAnalyzer(BaseVideoAnalyzer):
|
|
|
def _do_analyze(self):
|
|
|
- pass
|
|
|
+ return {"data": cal_tennisthrow(self.results)[1], "advice": "AI组说还没写完"}
|
|
|
|
|
|
|
|
|
-class CrunchVideoAnalyzer(BaseVideoAnalyzer):
|
|
|
+class JumpwithbothAnalyzer(BaseVideoAnalyzer):
|
|
|
def _do_analyze(self):
|
|
|
- pass
|
|
|
+ return {"data": cal_jumpwithboth(self.results)[1], "advice": "AI组说还没写完"}
|
|
|
|
|
|
|
|
|
-class StandingLongJumpVideoAnalyzer(BaseVideoAnalyzer):
|
|
|
+class SitforwardAnalyzer(BaseVideoAnalyzer):
|
|
|
def _do_analyze(self):
|
|
|
- frames_dir = UPLOAD_DIR + "frames/" + self.video_uuid + "/"
|
|
|
- result = {}
|
|
|
- for i in os.listdir(frames_dir):
|
|
|
- if i.endswith(".npy"):
|
|
|
- data = np.load(frames_dir + i)[0]
|
|
|
- result_side = analyse_npy_side_jump(data) # Analyze each frame
|
|
|
- result[int(i.replace(".npy", ""))] = result_side # Get the frame number to store the result
|
|
|
- return ignore_data_jump(result)
|
|
|
+ return {"data": cal_sitforward(self.results)[1], "advice": "AI组说还没写完"}
|
|
|
|
|
|
|
|
|
-class PlankVideoAnalyzer(BaseVideoAnalyzer):
|
|
|
+class BalancebeamAnalyzer(BaseVideoAnalyzer):
|
|
|
def _do_analyze(self):
|
|
|
- pass
|
|
|
+ return {"data": cal_balancebeam(self.results)[1], "advice": "AI组说还没写完"}
|
|
|
|
|
|
|
|
|
-class SquatVideoAnalyzer(BaseVideoAnalyzer):
|
|
|
+class StandingAnalyzer(BaseVideoAnalyzer):
|
|
|
def _do_analyze(self):
|
|
|
- pass
|
|
|
+ return {"data": cal_standing(self.results)[1], "advice": "AI组说还没写完"}
|