flask_api.py 11 KB

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