flask_api.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. import json
  2. import os
  3. from flask import Flask, request
  4. from flask_cors import *
  5. from PIL import Image
  6. import base64
  7. from analyse_func import do_analysis
  8. from classify import api_dyna
  9. from db_project import get_status, process_db, lookup_data, add_new_data_dyna, add_new_data, create_table_dynamic, \
  10. create_table, create_db
  11. import shutil
  12. from demo_func import run_3d_for_video
  13. # str_res=""
  14. # a dict contains the txt
  15. dict_total = {}
  16. li_last = []
  17. # store dic_data's json format
  18. bJson = ""
  19. global_index = [6]
  20. global_video_index = 0
  21. li_return = []
  22. img_return = []
  23. flag_run = False
  24. front_end_dir = "/root/www/dist"
  25. ##jump
  26. ##result["jump_power"]["level"]/["path"]/["val"]
  27. ##result["core_strength"]["level"]/["path"] 1 2 3 4
  28. ##result["landing_position"]["level"]/["path"]["val"]
  29. ##juanfu
  30. ## result["head_power"]["level"]/["path"]/["val"]
  31. # result["core_strength"]["level"]/["path"]
  32. ##result["body_stability"]["level"]/["val"]
  33. ##pingban
  34. """
  35. result["arm_strength"]["level"]/["path"]/["val"]
  36. result["stability"]["level"]/["path"]/["val"]
  37. result["standard"]["level"]/["path"]/["val"]
  38. """
  39. ##shendun
  40. """
  41. result["leg_strength"]["level"]/["path"]
  42. """
  43. ##gaotaitui
  44. """
  45. result["standard"]["level"]/["path"]
  46. """
  47. # read txt file and change it to the list format
  48. def read_pose_processes_txt_result():
  49. file_dir = "pose_processed_txt" # the file's path
  50. dir_list = os.listdir(file_dir) # dir_list=["1.txt","2.txt","3.txt","4.txt"]
  51. global li_last # 分析的最后结果
  52. global dict_total # list的字典
  53. li_last = []
  54. dict_total = {}
  55. for cur_file in dir_list:
  56. if (cur_file[0:len(cur_file) - 4] != str(global_index[0])):
  57. # print(cur_file[0:len(cur_file)-4])
  58. # print(global_index[0])
  59. continue
  60. path = os.path.join(file_dir, cur_file) # path="pose_processed_txt/1.txt"
  61. f = open(path, encoding='utf-8')
  62. lines = f.readlines()
  63. # process logic,{"正面分析":{“头部分析”:{},"肩部分析": {}}
  64. dic_data = {}
  65. for i in range(len(lines)):
  66. if lines[i][0] == '-':
  67. continue
  68. elif lines[i][0] == "正":
  69. dic_data = {"title": "正面分析如下"}
  70. li = []
  71. dic_1 = {}
  72. i = i + 1 # i是头部分析那行
  73. dic_1["name"] = "头部分析"
  74. dic_1["value"] = lines[i][5:len(lines[i]) - 1]
  75. i = i + 1 # 头部数字级别
  76. dic_1["level"] = int(lines[i].strip())
  77. li.append(dic_1)
  78. dic_2 = {}
  79. i += 2 # 第六行 i=6
  80. dic_2["name"] = "肩部分析"
  81. # num_risk_1 = int(lines[i + 1].strip())
  82. dic_2["value"] = lines[i][:-1] + " " + lines[(i + 1)][:-1]
  83. num_risk_2 = int(lines[i + 2].strip())
  84. dic_2["level"] = int(num_risk_2)
  85. li.append(dic_2)
  86. i += 4 # i=10
  87. dic_3 = {}
  88. dic_3["name"] = "髋部分析"
  89. dic_3["value"] = lines[i][:-1] + " " + lines[(i + 1)][:-1]
  90. num_risk_1 = int(lines[i + 2].strip())
  91. # num_risk_2 = int(lines[i + 3].strip())
  92. dic_3["level"] = int(max(num_risk_1, 0))
  93. i += 4 # i=14
  94. dic_4 = {"name": "腿型分析", "value": lines[i][:-1]}
  95. li.append(dic_3)
  96. li.append(dic_4)
  97. dic_data["detail"] = li
  98. if ("非" in lines[i][:-1]):
  99. dic_4["level"] = 0
  100. else:
  101. dic_4["level"] = 1
  102. li_last.append(dic_data)
  103. elif lines[i][0] == "侧":
  104. li = []
  105. dic_data = {"title": "侧面分析如下"}
  106. dic_1 = {}
  107. i += 1
  108. dic_1["name"] = "颈椎分析"
  109. if lines[i][4] != ":":
  110. dic_1["value"] = lines[i][0:len(lines[i]) - 1]
  111. else:
  112. dic_1["value"] = lines[i][5:len(lines[i]) - 1]
  113. dic_1["level"] = int(lines[i + 1].strip())
  114. i += 2
  115. dic_2 = {"name": "站姿分析", "value": lines[i][5:len(lines[i]) - 1]}
  116. dic_2["level"] = int(lines[i + 1].strip())
  117. i += 2
  118. dic_3 = {"name": "髋部分析", "value": lines[i][5:len(lines[i]) - 1]}
  119. dic_3["level"] = int(lines[i + 1].strip())
  120. i += 2
  121. dic_4 = {"name": "膝盖分析", "value": lines[i][7:len(lines[i]) - 1]}
  122. dic_4["level"] = int(lines[i + 1].strip())
  123. li.append(dic_1)
  124. li.append(dic_2)
  125. li.append(dic_3)
  126. li.append(dic_4)
  127. dic_data["detail"] = li
  128. li_last.append(dic_data)
  129. else:
  130. i += 1
  131. print(li_last)
  132. dict_total[cur_file] = li_last
  133. f.close()
  134. global li_return
  135. li_return = dict_total[(str(global_index[0]) + ".txt")]
  136. def run_the_process(index: int = 0, height: float = 110):
  137. # sys.path.append("../analyse_func.py")
  138. # import analyse_func
  139. # print(global_index[0])
  140. do_analysis(global_index[0], height)
  141. # 把list转化为可以直接返回的json格式
  142. def list_to_json(li):
  143. # print(li)
  144. aJson = json.dumps(li, ensure_ascii=False)
  145. print(aJson)
  146. # dict1={}
  147. # dict1["front"]="/home/seecoder/Documents/pose-correction/pc-demo/pose_processed_images/"+str(global_index[0])+"-0-result.jpg"
  148. # dict1["right"] = "/home/seecoder/Documents/pose-correction/pc-demo/pose_processed_images/" + \
  149. # str(global_index[0] )+ "-1-result.jpg"
  150. # print(dict1)
  151. return aJson
  152. # print(dic_data)
  153. app = Flask(__name__)
  154. def save_file(filed):
  155. base = "pose_source_images/"
  156. filename = filed.filename
  157. index = global_index[0]
  158. # global_index[0] = index
  159. suffix = ".png"
  160. if filename.find("jpg") > 0:
  161. suffix = ".jpg"
  162. elif filename.find("png") > 0:
  163. suffix = ".png"
  164. save_name = ""
  165. print(str(index) + "index")
  166. print(filename + "filename")
  167. if "front" in filename:
  168. save_name = base + str(index) + str("-0") + suffix
  169. print(filename + "filename_front")
  170. print(save_name + "savename_front")
  171. elif "right" in filename:
  172. save_name = base + str(index) + str("-1") + suffix
  173. print(filename + "filename_right")
  174. print(save_name + "savename_right")
  175. else:
  176. print("nope")
  177. filed.save(save_name)
  178. print(filename)
  179. print(save_name)
  180. # 运行动态分析的入口
  181. def run_video(mode, num, ana=1):
  182. q = "./video/" + str(num) + ".mp4"
  183. re = api_dyna(q, mode, ana)
  184. process_db(num)
  185. return re
  186. def lookup_video(num, ana=0):
  187. q = "./video/" + str(num) + ".mp4"
  188. mode = lookup_data(num)
  189. re = api_dyna(q, mode, ana)
  190. process_db(num)
  191. return re
  192. ###send a video and return a id marked the video (identical)
  193. @app.route('/get_videoid', methods=['POST'])
  194. @cross_origin()
  195. def get_videoid():
  196. dict_video_ = request.form.to_dict()
  197. dict_video_mp4 = request.files.to_dict()
  198. ff = dict_video_mp4["video"]
  199. mode = dict_video_["mode"]
  200. global global_video_index
  201. global_video_index = int(add_new_data_dyna(mode))
  202. base = "./video/"
  203. filename = base + str(global_video_index) + ".mp4"
  204. ff.save(filename)
  205. return {"id": str(global_video_index)}
  206. @app.route('/get_video_data', methods=['POST'])
  207. @cross_origin()
  208. def get_video_data():
  209. dict_video_ = request.form.to_dict()
  210. global global_video_index
  211. global_video_index = int(dict_video_["id"])
  212. # print(global_video_index)
  213. mode = str(lookup_data(global_video_index)) # get database mode
  214. # print(mode)
  215. re = run_video(mode, global_video_index, 1)
  216. return re
  217. @app.route('/get_video_status', methods=['POST'])
  218. @cross_origin()
  219. def get_video_status():
  220. dict_video_ = request.form.to_dict()
  221. global global_video_index
  222. global_video_index = int(dict_video_["id"])
  223. # bool = get_status(global_video_index) == 1
  224. return {"state": get_status(global_video_index) == 1}
  225. @app.route('/query_video', methods=['POST'])
  226. @cross_origin()
  227. def query_video():
  228. dict_video_ = request.form.to_dict()
  229. print(dict_video_)
  230. global global_video_index
  231. global_video_index = int(dict_video_["id"])
  232. if get_status(global_video_index) == 0:
  233. mode = str(lookup_data(global_video_index)) # get database mode
  234. run_video(mode, global_video_index, 1)
  235. return lookup_video(global_video_index, 0)
  236. def get_3D(id):
  237. video_path = "video/" + id + ".mp4"
  238. run_3d_for_video(video_path)
  239. @app.route('/query_3D', methods=['POST'])
  240. @cross_origin()
  241. def query_3D():
  242. id = request.form.to_dict()["id"]
  243. video_path = "video/" + id + "_reconstructed.mp4"
  244. saved_video_path = os.path.join(front_end_dir, os.path.basename(video_path))
  245. if not os.path.exists(saved_video_path):
  246. get_3D(id)
  247. shutil.copyfile(video_path, saved_video_path)
  248. print(saved_video_path)
  249. return {
  250. 'url': saved_video_path.replace(front_end_dir, "http://106.15.1.178:8001"),
  251. # 'status':'finished'
  252. }
  253. # result={xx:xx,xx:xx}
  254. # result={power:{val:xx,path:xx},strength:{val:xx,path:xx}}
  255. # 1.锻炼建议
  256. # 2.发送视频
  257. # 3.
  258. @app.route('/send_form', methods=['POST'])
  259. @cross_origin()
  260. def send_form():
  261. text_data = request.form.to_dict()
  262. fileList = request.files.to_dict()
  263. global global_index
  264. global_index[0] = int(add_new_data())
  265. for filed in fileList.values():
  266. save_file(filed)
  267. height = float(text_data["height"]) if text_data["height"] != "undefined" else None
  268. run_the_process(global_index[0], height)
  269. process_db(int(global_index[0]))
  270. return {
  271. "id": global_index[0],
  272. "status": True if height is not None else False
  273. }
  274. def get_base64(path):
  275. with open(path, "rb") as f:
  276. base64_data = base64.b64encode(f.read())
  277. return base64_data.decode()
  278. @app.route('/get_result', methods=['POST'])
  279. @cross_origin()
  280. def run_project():
  281. id = request.form.to_dict()["id"]
  282. print(id)
  283. base = "pose_processed_images"
  284. global_index[0] = int(id)
  285. read_pose_processes_txt_result()
  286. print(base + "/" + str(global_index[0]) + "-0-result.png")
  287. return {
  288. "front": get_base64(base + "/" + str(global_index[0]) + "-0-result.png"),
  289. "right": get_base64(base + "/" + str(global_index[0]) + "-1-result.png"),
  290. "data": list_to_json(li_return),
  291. }
  292. if __name__ == '__main__':
  293. # read_pose_processes_txt_result()
  294. # print(list_to_json(li_return))
  295. # app.run()
  296. # app.run(host="0.0.0.0", port=8090, debug=True)
  297. app.run(host="0.0.0.0", port=8090)
  298. CORS(app, resouces=r'/*')
  299. # run_video("gaotaitui",19,1)
  300. # lookup_video(41, 0)