flask_api.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  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. # str_res=""
  9. # a dict contains the txt
  10. dict_total = {}
  11. li_last = []
  12. # store dic_data's json format
  13. bJson = ""
  14. global_index = [6]
  15. li_return = []
  16. img_return = []
  17. ip_ad = "106.15.1.178"
  18. import pymysql
  19. db = pymysql.connect(host=ip_ad,
  20. user="root",
  21. password="root",
  22. port=3306, # 端口
  23. charset='utf8')
  24. cursor = db.cursor()
  25. def create_db():
  26. db = pymysql.connect(host=ip_ad,
  27. user="root",
  28. password="root",
  29. # port=3306, # 端口
  30. # charset='utf8')
  31. )
  32. cursor = db.cursor()
  33. # 使用 execute() 方法执行 SQL,如果表存在则删除
  34. # cursor.execute("DROP TABLE IF EXISTS pose")
  35. # 使用预处理语句创建表
  36. cursor.execute("create database if not exists pose")
  37. db.commit()
  38. db.close()
  39. cursor.close()
  40. def create_table():
  41. db = pymysql.connect(host=ip_ad,
  42. user="root",
  43. password="root",
  44. port=3306, # 端口
  45. charset='utf8',
  46. database="pose")
  47. cursor = db.cursor()
  48. sql = """CREATE TABLE pose(
  49. id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  50. status INT)
  51. """
  52. insert_table_sql = """INSERT INTO `pose` (`status`) VALUES ('0')"""
  53. cursor.execute(sql)
  54. db.commit()
  55. cursor.execute(insert_table_sql)
  56. version = cursor.fetchone()
  57. print(version)
  58. db.commit()
  59. db.close()
  60. def add_new_data():
  61. db = pymysql.connect(host=ip_ad,
  62. user="root",
  63. password="root",
  64. port=3306, # 端口
  65. database="pose",
  66. charset='utf8')
  67. cursor = db.cursor()
  68. insert_table_sql = """INSERT INTO `pose` (`status`) VALUES ( '0')"""
  69. cursor.execute(insert_table_sql)
  70. db.commit()
  71. db.close()
  72. cursor.close()
  73. return_id = cursor.lastrowid
  74. return return_id
  75. def process_db(id):
  76. db = pymysql.connect(host=ip_ad,
  77. user="root",
  78. password="root",
  79. port=3306, # 端口
  80. database="pose",
  81. charset='utf8')
  82. sql = "update pose set status = 1 where id = %d " % id
  83. cursor = db.cursor()
  84. cursor.execute(sql)
  85. db.commit()
  86. cursor.close()
  87. db.close()
  88. def get_status(id):
  89. db = pymysql.connect(host=ip_ad,
  90. user="root",
  91. password="root",
  92. port=3306, # 端口
  93. database="pose",
  94. charset='utf8')
  95. sql = "select status from pose where id =%d" % id
  96. cursor = db.cursor()
  97. status = cursor.execute(sql)
  98. cursor.close()
  99. db.close()
  100. if str(status) == "1":
  101. return True
  102. return False
  103. # read txt file and change it to the list format
  104. def read_pose_processes_txt_result():
  105. file_dir = "pose_processed_txt" # the file's path
  106. dir_list = os.listdir(file_dir) # dir_list=["1.txt","2.txt","3.txt","4.txt"]
  107. global li_last # 分析的最后结果
  108. global dict_total # list的字典
  109. li_last = []
  110. dict_total = {}
  111. for cur_file in dir_list:
  112. if (cur_file[0:len(cur_file) - 4] != str(global_index[0])):
  113. # print(cur_file[0:len(cur_file)-4])
  114. # print(global_index[0])
  115. continue
  116. path = os.path.join(file_dir, cur_file) # path="pose_processed_txt/1.txt"
  117. f = open(path, encoding='utf-8')
  118. lines = f.readlines()
  119. # process logic,{"正面分析":{“头部分析”:{},"肩部分析": {}}
  120. dic_data = {}
  121. for i in range(len(lines)):
  122. if lines[i][0] == '-':
  123. continue
  124. elif lines[i][0] == "正":
  125. dic_data = {"title": "正面分析如下"}
  126. li = []
  127. dic_1 = {}
  128. i = i + 1 # i是头部分析那行
  129. dic_1["name"] = "头部分析"
  130. dic_1["value"] = lines[i][5:len(lines[i]) - 1]
  131. i = i + 1
  132. dic_1["level"] = int(lines[i].strip())
  133. li.append(dic_1)
  134. dic_2 = {}
  135. i += 2
  136. dic_2["name"] = "肩部分析"
  137. num_risk_1 = int(lines[i + 1].strip())
  138. dic_2["value"] = lines[i][:-1] + " " + lines[(i + 2)][:-1]
  139. num_risk_2 = int(lines[i + 3].strip())
  140. dic_2["level"] = int(max(num_risk_1, num_risk_2))
  141. li.append(dic_2)
  142. i += 5
  143. dic_3 = {}
  144. dic_3["name"] = "髋部分析"
  145. dic_3["value"] = lines[i][:-1] + " " + lines[(i + 2)][:-1]
  146. num_risk_1 = int(lines[i + 1].strip())
  147. num_risk_2 = int(lines[i + 3].strip())
  148. dic_3["level"] = int(max(num_risk_1, num_risk_2))
  149. i += 5
  150. dic_4 = {"name": "腿型分析", "value": lines[i][:-1] + " " + lines[(i + 1)][:-1] + " " + lines[(i + 2)][:-1]}
  151. li.append(dic_3)
  152. li.append(dic_4)
  153. dic_data["detail"] = li
  154. if ("非" in lines[(i + 2)][:-1]):
  155. dic_4["level"] = 0
  156. else:
  157. dic_4["level"] = 1
  158. li_last.append(dic_data)
  159. elif lines[i][0] == "侧":
  160. li = []
  161. dic_data = {"title": "侧面分析如下"}
  162. dic_1 = {}
  163. i += 1
  164. dic_1["name"] = "颈椎分析"
  165. if lines[i][4] != ":":
  166. dic_1["value"] = lines[i][0:len(lines[i]) - 1]
  167. else:
  168. dic_1["value"] = lines[i][5:len(lines[i]) - 1]
  169. dic_1["level"] = int(lines[i + 1].strip())
  170. i += 2
  171. dic_2 = {"name": "站姿分析", "value": lines[i][5:len(lines[i]) - 1]}
  172. dic_2["level"] = int(lines[i + 1].strip())
  173. i += 2
  174. dic_3 = {"name": "髋部分析", "value": lines[i][5:len(lines[i]) - 1]}
  175. dic_3["level"] = int(lines[i + 1].strip())
  176. i += 2
  177. dic_4 = {"name": "膝盖分析", "value": lines[i][7:len(lines[i]) - 1]}
  178. dic_4["level"] = int(lines[i + 1].strip())
  179. li.append(dic_1)
  180. li.append(dic_2)
  181. li.append(dic_3)
  182. li.append(dic_4)
  183. dic_data["detail"] = li
  184. li_last.append(dic_data)
  185. else:
  186. i += 1
  187. print(li_last)
  188. dict_total[cur_file] = li_last
  189. f.close()
  190. global li_return
  191. li_return = dict_total[(str(global_index[0]) + ".txt")]
  192. def run_the_process(index: int = 0, height: float = 110):
  193. # sys.path.append("../analyse_func.py")
  194. # import analyse_func
  195. # print(global_index[0])
  196. do_analysis(global_index[0], height)
  197. # 把list转化为可以直接返回的json格式
  198. def list_to_json(li):
  199. # print(li)
  200. aJson = json.dumps(li, ensure_ascii=False)
  201. print(aJson)
  202. # dict1={}
  203. # dict1["front"]="/home/seecoder/Documents/pose-correction/pc-demo/pose_processed_images/"+str(global_index[0])+"-0-result.jpg"
  204. # dict1["right"] = "/home/seecoder/Documents/pose-correction/pc-demo/pose_processed_images/" + \
  205. # str(global_index[0] )+ "-1-result.jpg"
  206. # print(dict1)
  207. return aJson
  208. # print(dic_data)
  209. app = Flask(__name__)
  210. def save_images(file):
  211. base = "pose_source_images/"
  212. filename = file.filename
  213. index = global_index[0]
  214. # global_index[0] = index
  215. suffix = ".png"
  216. if filename.find("jpg") > 0:
  217. suffix = ".jpg"
  218. elif filename.find("png") > 0:
  219. suffix = ".png"
  220. save_name = ""
  221. print(str(index) + "index")
  222. print(filename + "filename")
  223. if "front" in filename:
  224. save_name = base + str(index) + str("-0") + suffix
  225. print(filename + "filename_front")
  226. print(save_name + "savename_front")
  227. elif "right" in filename:
  228. save_name = base + str(index) + str("-1") + suffix
  229. print(filename + "filename_right")
  230. print(save_name + "savename_right")
  231. else:
  232. print("nope")
  233. file.save(save_name)
  234. print(filename)
  235. print(save_name)
  236. def save_videos(file):
  237. base = "3d_pose/input/"
  238. filename = file.filename
  239. # global_index[0] = index
  240. save_name = base + filename
  241. print(filename)
  242. print(save_name)
  243. file.save(save_name)
  244. @app.route('/send_form', methods=['POST'])
  245. @cross_origin()
  246. def send_form():
  247. text_data = request.form.to_dict()
  248. fileList = request.files.to_dict()
  249. global global_index
  250. global_index[0] = int(add_new_data())
  251. for file in fileList.values():
  252. save_images(file)
  253. height = float(text_data["height"]) if text_data["height"] != "undefined" else None
  254. run_the_process(global_index[0], height)
  255. process_db(int(global_index[0]))
  256. return {
  257. "id": global_index[0],
  258. "status": True if height is not None else False
  259. }
  260. @app.route('/submit_video', methods=['POST'])
  261. @cross_origin()
  262. def send_video():
  263. # text_data = request.form.to_dict()
  264. fileList = request.files.to_dict()
  265. for file in fileList.values():
  266. save_videos(file)
  267. def get_base64(path):
  268. with open(path, "rb") as f:
  269. base64_data = base64.b64encode(f.read())
  270. return base64_data.decode()
  271. @app.route('/get_result', methods=['POST'])
  272. @cross_origin()
  273. def run_project():
  274. id = request.form.to_dict()["id"]
  275. print(id)
  276. base = "pose_processed_images"
  277. global_index[0] = int(id)
  278. read_pose_processes_txt_result()
  279. print(base + "/" + str(global_index[0]) + "-0-result.png")
  280. return {
  281. "front": get_base64(base + "/" + str(global_index[0]) + "-0-result.png"),
  282. "right": get_base64(base + "/" + str(global_index[0]) + "-1-result.png"),
  283. "data": list_to_json(li_return),
  284. }
  285. if __name__ == '__main__':
  286. # read_pose_processes_txt_result()
  287. # print(list_to_json(li_return))
  288. # app.run()
  289. app.run(host="0.0.0.0", port=8090, debug=True)
  290. CORS(app, resouces=r'/*')