import os import math import cv2 from demo_func import run_openpose_for_normal from PIL import Image from analyse_jump import analyse_npy_side_jump, analyse_npy_side_pingban, analyse_npy_side_juanfu, \ analyse_npy_side_gaotaitui, analyse_npy_side_shendun import glob import time import os def split_video(path): video_path = path os.path.split(path) tur = os.path.split(path) print("split_video1") print(path) print(tur[len(tur) - 1].split('.')[0]) name = tur[len(tur) - 1].split('.')[0] if os.path.exists("./capture_image/" + name) == False: os.mkdir("./capture_image/" + name) cap = cv2.VideoCapture(video_path) FPS = cap.get(5) print(FPS) c = 1 frameRate = 1 if os.path.exists("./capture_image/" + name) == False: os.mkdir("./capture_image/" + name) while (True): ret, frame = cap.read() if ret: if (c % frameRate == 0): cv2.imwrite("./capture_image/" + name + "/capture_image" + str(c) + '.png', frame) c += 1 cv2.waitKey(0) else: break cap.release() print(c) return c def process_photo(name, c): print("process_photo" + name) for i in range(1, c): run_openpose_for_normal(i, name) # run_openpose_for_normal(i) # 保存跑完模型后的视频 def gather_video(path): video_path = path os.path.split(path) tur = os.path.split(path) print(tur[len(tur) - 1].split('.')[0]) name = tur[len(tur) - 1].split('.')[0] cap = cv2.VideoCapture(video_path) fps = cap.get(5) num_frames = len(os.listdir(r'./capture_image/' + name)) print(num_frames) img_array = [] im = Image.open("./capture_image/" + name + "/capture_image_result1.png") # img_width = 720 # img_height = 1280 k = 0 for i in range(num_frames + 1): filename = "./capture_image/" + name + "/capture_image_result" + str(i) + ".png" k += 1 img = cv2.imread(filename) if img is None: continue img_array.append(img) print(k) save_name = "./video/video_a/" + name + ".mp4" out = cv2.VideoWriter(save_name, cv2.VideoWriter_fourcc(*"mp4v"), fps, im.size) for i in range(len(img_array)): out.write(img_array[i]) out.release() im.close() def do_analysis(a_path, video_path, mode): path = video_path os.path.split(path) tur = os.path.split(path) name = tur[len(tur) - 1].split('.')[0] if not os.path.exists("./cap_file/" + name): os.mkdir("./cap_file/" + name) # ticks=time.time() source_npy_side = a_path output = open("./cap_file/" + name + "/file2" + ".txt", "w") output.close() result = {} p = './capture_image/' + name + "/" lenF = int(len(glob.glob(p + '*.png')) / 2) # 对每一张图片的body_25点数据进行分析 for i in range(1, lenF): # run_openpose_for_normal(i) if (mode == "jump"): result_side = analyse_npy_side_jump(name, i, source_npy_side.format(i)) elif (mode == "pingban"): result_side = analyse_npy_side_pingban(name, i, source_npy_side.format(i)) elif (mode == "juanfu"): result_side = analyse_npy_side_juanfu(name, i, source_npy_side.format(i)) elif (mode == "gaotaitui"): result_side = analyse_npy_side_gaotaitui(name, i, source_npy_side.format(i)) elif (mode == "shendun"): result_side = analyse_npy_side_shendun(name, i, source_npy_side.format(i)) if (result_side != False): result[i] = result_side # print(result[i]) output = open("./cap_file/" + name + "/file1.txt", "w") for re in result: print(re, file=output) for (name, value) in result[re].items(): print(name, value, sep=',', file=output) print("kv-over", file=output) output.close() def read2(fileName="./cap_file/file1.txt"): file = open(fileName) db = {} key = file.readline().strip() while (key != "kv-over\n"): if not key: break person = {} field = file.readline().strip() while field != "kv-over": name, value = field.split(",") person[name] = value.strip() field = file.readline().strip() if (field == "kv-over\n"): break db[key] = person key = file.readline().strip() print("db==== ", db) return db def ignore_data_pingban(result): result_ig = result k = "0" last = {} max_index = 1 for re in result: if k == "0": k = re else: if (max_index < int(re)): max_index = int(re) max_angle = abs(float(result_ig[k]["s_e_angle"]) - float(result_ig[k]["e_w_angle"])) max_num = int(k) less_angle = 100 less_num = 1 max_less_a = 1 max_less_num = k for i in result_ig: if (int(i) >= max_index / 3 and int(i) <= max_index / 3 * 2): val = math.fabs( math.fabs(float(result_ig[i]["hip_knee_angle"])) - math.fabs(float(result_ig[i]["knee_ankle_angle"]))) an_ = abs(float(result_ig[i]["s_e_angle"]) - float(result_ig[i]["e_w_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 (an_ < max_angle): max_angle = an_ max_num = i if (math.fabs(math.fabs(float(result_ig[i]["hip_knee_angle"])) - math.fabs( float(result_ig[i]["knee_ankle_angle"]))) > max_less_a): max_less_an = val max_less_num = int(i) re = {} re["1"] = {} re["1"]["num"] = max_num re["1"]["val"] = max_angle re["2"] = {} re["2"]["num"] = less_num re["2"]["val"] = less_angle re["3"] = {} re["3"]["num"] = max_less_num re["3"]["val"] = max_less_a # 1表示手肘和肩膀最小角度 # 2表示最小的身体角度差 # 3表示最大的身体角度差 # 1用来说明手部力量 3-2说明稳定性 2说明最好的状态 3说明最差的状态 print(re) return result_ig, re def ignore_data_juanfu(result): result_ig = result k = "0" last = {} max_index = 1 for re in result: if k == "0": k = re else: if (max_index < int(re)): max_index = int(re) max_angle = result[k]["nose_neck_angle"] max_num = int(k) less_h_k_a = result[k]["hip_knee_angle"] less_h_k_num = k max_h_k_a = result[k]["hip_knee_angle"] max_h_k_num = k less_k_a_a = result[k]["knee_ankle_angle"] less_k_a_num = k max_k_a_a = result[k]["knee_ankle_angle"] max_k_a_num = k max_neck_hip_a = result[k]["neck_hip_angle"] max_neck_hip_num = k for i in result_ig: if (float(result_ig[i]["nose_neck_angle"]) > float(max_angle)): max_num = int(i) max_angle = result_ig[i]["nose_neck_angle"] if (float(result_ig[i]["hip_knee_angle"]) > float(max_h_k_a)): max_h_k_num = int(i) max_h_k_a = result_ig[i]["hip_knee_angle"] if (float(result_ig[i]["knee_ankle_angle"]) > float(max_k_a_a)): max_k_a_num = int(i) max_k_a_a = result_ig[i]["knee_ankle_angle"] if (float(result_ig[i]["neck_hip_angle"]) > float(max_neck_hip_a)): max_neck_hip_num = int(i) max_neck_hip_a = result_ig[i]["neck_hip_angle"] if (float(result_ig[i]["hip_knee_angle"]) < float(less_h_k_a)): less_h_k_num = int(i) less_h_k_a = result_ig[i]["hip_knee_angle"] if (float(result_ig[i]["knee_ankle_angle"]) < float(less_k_a_a)): less_k_a_num = int(i) less_k_a_a = result_ig[i]["knee_ankle_angle"] re = {} re["1"] = {} re["1"]["num"] = max_num re["1"]["val"] = max_angle re["2"] = {} re["2"]["num"] = max_neck_hip_num re["2"]["val"] = max_neck_hip_a re["3"] = {} re["3"]["num"] = float(max_h_k_a) - float(less_h_k_a) re["3"]["num1"] = max_h_k_num re["3"]["num2"] = less_h_k_num re["3"]["val1"] = max_h_k_a re["3"]["val2"] = less_h_k_a re["4"] = {} re["4"]["num"] = float(max_k_a_a) - float(less_k_a_a) re["4"]["num1"] = max_k_a_num re["4"]["num2"] = less_k_a_num re["4"]["val1"] = max_k_a_a re["4"]["val2"] = less_k_a_a # 1表示头部和脖子角度 # 2表示脖子和臀部角度 # 3表示hip-knee的极差 稳定性 # 4表示knee-ankle的极差 稳定性 # 3的数据误差太大 待用性待考察 print(re) return result_ig, re def ignore_data_gaotaitui(result): result_ig = result k = "0" last = {} max_index = 1 for re in result: if k == "0": k = re else: if (max_index < int(re)): max_index = int(re) print("ignore_data_gaotaitui--------") print(k) max_leg_knee_r_angle = result_ig[k]["knee_ankle_r_angle"] max_leg_knee_l_angle = result_ig[k]["knee_ankle_l_angle"] max_leg_knee_angle_num = int(k) panduan = {} for i in result_ig: if (float(result_ig[i]["l_d"]) < 30): if (float(result_ig[i]["knee_ankle_r_angle"]) < 60 and float(result_ig[i]["hip_knee_r_angle"]) > 120): panduan[i] = result_ig[i]["r_d"] f = 0 # ma=0 print("panduan-----------") print(panduan) ma = panduan[k] key_k = k for key in panduan: if f == 0: ma = panduan[key] f = 1 key_k = key elif float(ma) > float(panduan[key]): key_k = key ma = panduan[key] re = {} re["1"] = {} re["1"]["num"] = key_k re["1"]["val"] = ma re["1"]["hip_knee_r_angle"] = result_ig[key_k]["hip_knee_r_angle"] re["1"]["knee_ankle_r_angle"] = result_ig[key_k]["knee_ankle_r_angle"] return result_ig, re def ignore_data_jump(result): print("ignore_data_jump") print(result) result_ig = result k = "0" last = {} max_index = 1 for re in result: if k == "0": k = re else: if (max_index < int(re)): max_index = int(re) max_leg_knee_angle = result_ig[k]["knee_ankle_angle"] max_leg_knee_angle_num = int(k) less_angle = 100 less_num = 1 ankle = result_ig[k]["leg_heigh"] ankle_num = int(k) max_leg_knee_hip_knee = math.fabs(float(result_ig[k]["hip_knee_angle"]) - float(result_ig[k]["knee_ankle_angle"])) max_l_h_num = 1 hip_hei_init = float(result_ig[k]["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 result_ig, re def ignore_data_shendun(result): result_ig = result k = "0" last = {} max_index = 1 for re in result: if k == "0": k = re else: if (max_index < int(re)): max_index = int(re) max_d_num = k max_d = result[k]["r_d"] for i in result_ig: if (float(result_ig[i]["r_d"]) > float(max_d)): max_d_num = int(i) max_d = result_ig[i]["r_d"] re = {} re["1"] = {} re["1"]["num"] = max_d_num re["1"]["val"] = max_d # 1最大的深蹲角度 return result_ig, re def write1(result, name): output = open(name, "w") for re in result: print(re, file=output) for (name, value) in result[re].items(): print(name, value, sep=',', file=output) print("kv-over", file=output) output.close() return name def run(video_path, mode, need_split): path = video_path os.path.split(path) tur = os.path.split(path) name = tur[len(tur) - 1].split('.')[0] if (need_split == 1): c = split_video(video_path) process_photo(name, c) gather_video(video_path) do_analysis("./capture_image/" + name + "/capture_image{}-1.png.npy", video_path, mode) switch = {'jump': ignore_data_jump, # 注意此处不要加括号 'pingban': ignore_data_pingban, 'juanfu': ignore_data_juanfu, 'shendun': ignore_data_shendun, 'gaotaitui': ignore_data_gaotaitui, } choice = mode # 获取选择 result, re = switch.get(choice, ignore_data_jump)(read2("./cap_file/" + name + "/file1.txt")) # 执行对应的函数,如果没有就执行默认的函数 # result,re=ignore_data_juanfu(read2("./cap_file/"+name+"/file1.txt")) write1(result, "./cap_file/" + name + "/file3.txt") write1(re, "./cap_file/" + name + "-file.txt") # write1() return re if __name__ == '__main__': video_path = "./video/43.mp4" # path=video_path # os.path.split(path) # tur=os.path.split(path) # name=tur[len(tur)-1].split('.')[0] # c=split_video(video_path) # process_photo(name,c) # gather_video(video_path) # do_analysis("./capture_image/"+name+"/capture_image{}-1.png.npy",video_path,"shendun") # result,re=ignore_data_shendun(read2("./cap_file/"+name+"/file1.txt")) # write1(result,"./cap_file/"+name+"/file3.txt") # write1(re,"./cap_file/"+name+"-file.txt") # write1() # print(re) # re = run(video_path, "juanfu", 1) # 参数一 video_path # 参数二 shendun jump gaotaitui juanfu pingban # 第三个参数为1 表示需要视频切割