video_to_photo.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. import os
  2. import math
  3. import cv2
  4. from demo_func import run_openpose_for_normal
  5. from PIL import Image
  6. from analyse_jump import analyse_npy_side_jump, analyse_npy_side_pingban, analyse_npy_side_juanfu, \
  7. analyse_npy_side_gaotaitui, analyse_npy_side_shendun
  8. import glob
  9. import time
  10. import os
  11. def split_video(path):
  12. video_path = path
  13. os.path.split(path)
  14. tur = os.path.split(path)
  15. print("split_video1")
  16. print(path)
  17. print(tur[len(tur) - 1].split('.')[0])
  18. name = tur[len(tur) - 1].split('.')[0]
  19. if os.path.exists("./capture_image/" + name) == False:
  20. os.mkdir("./capture_image/" + name)
  21. cap = cv2.VideoCapture(video_path)
  22. FPS = cap.get(5)
  23. print(FPS)
  24. c = 1
  25. frameRate = 1
  26. if os.path.exists("./capture_image/" + name) == False:
  27. os.mkdir("./capture_image/" + name)
  28. while (True):
  29. ret, frame = cap.read()
  30. if ret:
  31. if (c % frameRate == 0):
  32. cv2.imwrite("./capture_image/" + name + "/capture_image" + str(c) + '.png', frame)
  33. c += 1
  34. cv2.waitKey(0)
  35. else:
  36. break
  37. cap.release()
  38. print(c)
  39. return c
  40. def process_photo(name, c):
  41. print("process_photo" + name)
  42. for i in range(1, c):
  43. run_openpose_for_normal(i, name)
  44. # run_openpose_for_normal(i)
  45. # 保存跑完模型后的视频
  46. def gather_video(path):
  47. video_path = path
  48. os.path.split(path)
  49. tur = os.path.split(path)
  50. print(tur[len(tur) - 1].split('.')[0])
  51. name = tur[len(tur) - 1].split('.')[0]
  52. cap = cv2.VideoCapture(video_path)
  53. fps = cap.get(5)
  54. num_frames = len(os.listdir(r'./capture_image/' + name))
  55. print(num_frames)
  56. img_array = []
  57. im = Image.open("./capture_image/" + name + "/capture_image_result1.png")
  58. # img_width = 720
  59. # img_height = 1280
  60. k = 0
  61. for i in range(num_frames + 1):
  62. filename = "./capture_image/" + name + "/capture_image_result" + str(i) + ".png"
  63. k += 1
  64. img = cv2.imread(filename)
  65. if img is None:
  66. continue
  67. img_array.append(img)
  68. print(k)
  69. save_name = "./video/video_a/" + name + ".mp4"
  70. out = cv2.VideoWriter(save_name, cv2.VideoWriter_fourcc(*"mp4v"), fps, im.size)
  71. for i in range(len(img_array)):
  72. out.write(img_array[i])
  73. out.release()
  74. im.close()
  75. def do_analysis(a_path, video_path, mode):
  76. path = video_path
  77. os.path.split(path)
  78. tur = os.path.split(path)
  79. name = tur[len(tur) - 1].split('.')[0]
  80. if not os.path.exists("./cap_file/" + name):
  81. os.mkdir("./cap_file/" + name)
  82. # ticks=time.time()
  83. source_npy_side = a_path
  84. output = open("./cap_file/" + name + "/file2" + ".txt", "w")
  85. output.close()
  86. result = {}
  87. p = './capture_image/' + name + "/"
  88. lenF = int(len(glob.glob(p + '*.png')) / 2)
  89. # 对每一张图片的body_25点数据进行分析
  90. for i in range(1, lenF): # run_openpose_for_normal(i)
  91. if (mode == "jump"):
  92. result_side = analyse_npy_side_jump(name, i, source_npy_side.format(i))
  93. elif (mode == "pingban"):
  94. result_side = analyse_npy_side_pingban(name, i, source_npy_side.format(i))
  95. elif (mode == "juanfu"):
  96. result_side = analyse_npy_side_juanfu(name, i, source_npy_side.format(i))
  97. elif (mode == "gaotaitui"):
  98. result_side = analyse_npy_side_gaotaitui(name, i, source_npy_side.format(i))
  99. elif (mode == "shendun"):
  100. result_side = analyse_npy_side_shendun(name, i, source_npy_side.format(i))
  101. if (result_side != False):
  102. result[i] = result_side
  103. # print(result[i])
  104. output = open("./cap_file/" + name + "/file1.txt", "w")
  105. for re in result:
  106. print(re, file=output)
  107. for (name, value) in result[re].items():
  108. print(name, value, sep=',', file=output)
  109. print("kv-over", file=output)
  110. output.close()
  111. def read2(fileName="./cap_file/file1.txt"):
  112. file = open(fileName)
  113. db = {}
  114. key = file.readline().strip()
  115. while (key != "kv-over\n"):
  116. if not key:
  117. break
  118. person = {}
  119. field = file.readline().strip()
  120. while field != "kv-over":
  121. name, value = field.split(",")
  122. person[name] = value.strip()
  123. field = file.readline().strip()
  124. if (field == "kv-over\n"):
  125. break
  126. db[key] = person
  127. key = file.readline().strip()
  128. print("db==== ", db)
  129. return db
  130. def ignore_data_pingban(result):
  131. result_ig = result
  132. k = "0"
  133. last = {}
  134. max_index = 1
  135. for re in result:
  136. if k == "0":
  137. k = re
  138. else:
  139. if (max_index < int(re)):
  140. max_index = int(re)
  141. max_angle = abs(float(result_ig[k]["s_e_angle"]) - float(result_ig[k]["e_w_angle"]))
  142. max_num = int(k)
  143. less_angle = 100
  144. less_num = 1
  145. max_less_a = 1
  146. max_less_num = k
  147. for i in result_ig:
  148. if (int(i) >= max_index / 3 and int(i) <= max_index / 3 * 2):
  149. val = math.fabs(
  150. math.fabs(float(result_ig[i]["hip_knee_angle"])) - math.fabs(float(result_ig[i]["knee_ankle_angle"])))
  151. an_ = abs(float(result_ig[i]["s_e_angle"]) - float(result_ig[i]["e_w_angle"]))
  152. if (math.fabs(math.fabs(float(result_ig[i]["hip_knee_angle"])) - math.fabs(
  153. float(result_ig[i]["knee_ankle_angle"]))) < less_angle):
  154. less_angle = val
  155. less_num = int(i)
  156. if (an_ < max_angle):
  157. max_angle = an_
  158. max_num = i
  159. if (math.fabs(math.fabs(float(result_ig[i]["hip_knee_angle"])) - math.fabs(
  160. float(result_ig[i]["knee_ankle_angle"]))) > max_less_a):
  161. max_less_an = val
  162. max_less_num = int(i)
  163. re = {}
  164. re["1"] = {}
  165. re["1"]["num"] = max_num
  166. re["1"]["val"] = max_angle
  167. re["2"] = {}
  168. re["2"]["num"] = less_num
  169. re["2"]["val"] = less_angle
  170. re["3"] = {}
  171. re["3"]["num"] = max_less_num
  172. re["3"]["val"] = max_less_a
  173. # 1表示手肘和肩膀最小角度
  174. # 2表示最小的身体角度差
  175. # 3表示最大的身体角度差
  176. # 1用来说明手部力量 3-2说明稳定性 2说明最好的状态 3说明最差的状态
  177. print(re)
  178. return result_ig, re
  179. def ignore_data_juanfu(result):
  180. result_ig = result
  181. k = "0"
  182. last = {}
  183. max_index = 1
  184. for re in result:
  185. if k == "0":
  186. k = re
  187. else:
  188. if (max_index < int(re)):
  189. max_index = int(re)
  190. max_angle = result[k]["nose_neck_angle"]
  191. max_num = int(k)
  192. less_h_k_a = result[k]["hip_knee_angle"]
  193. less_h_k_num = k
  194. max_h_k_a = result[k]["hip_knee_angle"]
  195. max_h_k_num = k
  196. less_k_a_a = result[k]["knee_ankle_angle"]
  197. less_k_a_num = k
  198. max_k_a_a = result[k]["knee_ankle_angle"]
  199. max_k_a_num = k
  200. max_neck_hip_a = result[k]["neck_hip_angle"]
  201. max_neck_hip_num = k
  202. for i in result_ig:
  203. if (float(result_ig[i]["nose_neck_angle"]) > float(max_angle)):
  204. max_num = int(i)
  205. max_angle = result_ig[i]["nose_neck_angle"]
  206. if (float(result_ig[i]["hip_knee_angle"]) > float(max_h_k_a)):
  207. max_h_k_num = int(i)
  208. max_h_k_a = result_ig[i]["hip_knee_angle"]
  209. if (float(result_ig[i]["knee_ankle_angle"]) > float(max_k_a_a)):
  210. max_k_a_num = int(i)
  211. max_k_a_a = result_ig[i]["knee_ankle_angle"]
  212. if (float(result_ig[i]["neck_hip_angle"]) > float(max_neck_hip_a)):
  213. max_neck_hip_num = int(i)
  214. max_neck_hip_a = result_ig[i]["neck_hip_angle"]
  215. if (float(result_ig[i]["hip_knee_angle"]) < float(less_h_k_a)):
  216. less_h_k_num = int(i)
  217. less_h_k_a = result_ig[i]["hip_knee_angle"]
  218. if (float(result_ig[i]["knee_ankle_angle"]) < float(less_k_a_a)):
  219. less_k_a_num = int(i)
  220. less_k_a_a = result_ig[i]["knee_ankle_angle"]
  221. re = {}
  222. re["1"] = {}
  223. re["1"]["num"] = max_num
  224. re["1"]["val"] = max_angle
  225. re["2"] = {}
  226. re["2"]["num"] = max_neck_hip_num
  227. re["2"]["val"] = max_neck_hip_a
  228. re["3"] = {}
  229. re["3"]["num"] = float(max_h_k_a) - float(less_h_k_a)
  230. re["3"]["num1"] = max_h_k_num
  231. re["3"]["num2"] = less_h_k_num
  232. re["3"]["val1"] = max_h_k_a
  233. re["3"]["val2"] = less_h_k_a
  234. re["4"] = {}
  235. re["4"]["num"] = float(max_k_a_a) - float(less_k_a_a)
  236. re["4"]["num1"] = max_k_a_num
  237. re["4"]["num2"] = less_k_a_num
  238. re["4"]["val1"] = max_k_a_a
  239. re["4"]["val2"] = less_k_a_a
  240. # 1表示头部和脖子角度
  241. # 2表示脖子和臀部角度
  242. # 3表示hip-knee的极差 稳定性
  243. # 4表示knee-ankle的极差 稳定性
  244. # 3的数据误差太大 待用性待考察
  245. print(re)
  246. return result_ig, re
  247. def ignore_data_gaotaitui(result):
  248. result_ig = result
  249. k = "0"
  250. last = {}
  251. max_index = 1
  252. for re in result:
  253. if k == "0":
  254. k = re
  255. else:
  256. if (max_index < int(re)):
  257. max_index = int(re)
  258. print("ignore_data_gaotaitui--------")
  259. print(k)
  260. max_leg_knee_r_angle = result_ig[k]["knee_ankle_r_angle"]
  261. max_leg_knee_l_angle = result_ig[k]["knee_ankle_l_angle"]
  262. max_leg_knee_angle_num = int(k)
  263. panduan = {}
  264. for i in result_ig:
  265. if (float(result_ig[i]["l_d"]) < 30):
  266. if (float(result_ig[i]["knee_ankle_r_angle"]) < 60 and float(result_ig[i]["hip_knee_r_angle"]) > 120):
  267. panduan[i] = result_ig[i]["r_d"]
  268. f = 0
  269. # ma=0
  270. print("panduan-----------")
  271. print(panduan)
  272. ma = panduan[k]
  273. key_k = k
  274. for key in panduan:
  275. if f == 0:
  276. ma = panduan[key]
  277. f = 1
  278. key_k = key
  279. elif float(ma) > float(panduan[key]):
  280. key_k = key
  281. ma = panduan[key]
  282. re = {}
  283. re["1"] = {}
  284. re["1"]["num"] = key_k
  285. re["1"]["val"] = ma
  286. re["1"]["hip_knee_r_angle"] = result_ig[key_k]["hip_knee_r_angle"]
  287. re["1"]["knee_ankle_r_angle"] = result_ig[key_k]["knee_ankle_r_angle"]
  288. return result_ig, re
  289. def ignore_data_jump(result):
  290. print("ignore_data_jump")
  291. print(result)
  292. result_ig = result
  293. k = "0"
  294. last = {}
  295. max_index = 1
  296. for re in result:
  297. if k == "0":
  298. k = re
  299. else:
  300. if (max_index < int(re)):
  301. max_index = int(re)
  302. max_leg_knee_angle = result_ig[k]["knee_ankle_angle"]
  303. max_leg_knee_angle_num = int(k)
  304. less_angle = 100
  305. less_num = 1
  306. ankle = result_ig[k]["leg_heigh"]
  307. ankle_num = int(k)
  308. max_leg_knee_hip_knee = math.fabs(float(result_ig[k]["hip_knee_angle"]) - float(result_ig[k]["knee_ankle_angle"]))
  309. max_l_h_num = 1
  310. hip_hei_init = float(result_ig[k]["hip_heigh"])
  311. # print("max")
  312. # print(max_index)
  313. # print(hip_hei_init)
  314. for i in result_ig:
  315. if int(i) <= max_index / 5:
  316. if float(max_leg_knee_angle) < float(result_ig[i]["knee_ankle_angle"]):
  317. max_leg_knee_angle_num = int(i)
  318. max_leg_knee_angle = result_ig[i]["knee_ankle_angle"]
  319. if int(i) <= max_index / 2 and int(i) > max_index / 3:
  320. val = math.fabs(
  321. math.fabs(float(result_ig[i]["hip_knee_angle"])) - math.fabs(float(result_ig[i]["knee_ankle_angle"])))
  322. if (math.fabs(math.fabs(float(result_ig[i]["hip_knee_angle"])) - math.fabs(
  323. float(result_ig[i]["knee_ankle_angle"]))) < less_angle):
  324. less_angle = val
  325. less_num = int(i)
  326. if int(i) <= max_index and int(i) > (max_index / 3):
  327. if (float(result_ig[i]["hip_heigh"])) < (float(hip_hei_init)) and max_l_h_num != 1:
  328. break
  329. if (math.fabs(math.fabs(float(result_ig[i]["hip_knee_angle"])) - math.fabs(
  330. float(result_ig[i]["knee_ankle_angle"])))) > max_leg_knee_hip_knee and math.fabs(
  331. float(result_ig[i]["leg_heigh"]) - float(ankle)) <= 20:
  332. max_leg_knee_hip_knee = math.fabs(
  333. float(result_ig[i]["hip_knee_angle"]) - math.fabs(float(result_ig[i]["knee_ankle_angle"])))
  334. max_l_h_num = int(i)
  335. # ankle=result_ig[i]["leg_heigh"]
  336. # ankle_num=int(i)
  337. # elif ankle!=1 and int(i)>=(le/3*2):
  338. # break
  339. print(max_leg_knee_angle)
  340. print(max_leg_knee_angle_num)
  341. print(less_num)
  342. print(less_angle)
  343. # print(ankle)
  344. # print(ankle_num)
  345. print(max_leg_knee_hip_knee)
  346. print(max_l_h_num)
  347. re = {}
  348. re["1"] = {}
  349. re["1"]["num"] = max_leg_knee_angle_num
  350. re["1"]["val"] = max_leg_knee_angle
  351. re["2"] = {}
  352. re["2"]["num"] = less_num
  353. re["2"]["val"] = less_angle
  354. re["3"] = {}
  355. re["3"]["num"] = max_l_h_num
  356. re["3"]["val"] = max_leg_knee_hip_knee
  357. print(re)
  358. return result_ig, re
  359. def ignore_data_shendun(result):
  360. result_ig = result
  361. k = "0"
  362. last = {}
  363. max_index = 1
  364. for re in result:
  365. if k == "0":
  366. k = re
  367. else:
  368. if (max_index < int(re)):
  369. max_index = int(re)
  370. max_d_num = k
  371. max_d = result[k]["r_d"]
  372. for i in result_ig:
  373. if (float(result_ig[i]["r_d"]) > float(max_d)):
  374. max_d_num = int(i)
  375. max_d = result_ig[i]["r_d"]
  376. re = {}
  377. re["1"] = {}
  378. re["1"]["num"] = max_d_num
  379. re["1"]["val"] = max_d
  380. # 1最大的深蹲角度
  381. return result_ig, re
  382. def write1(result, name):
  383. output = open(name, "w")
  384. for re in result:
  385. print(re, file=output)
  386. for (name, value) in result[re].items():
  387. print(name, value, sep=',', file=output)
  388. print("kv-over", file=output)
  389. output.close()
  390. return name
  391. def run(video_path, mode, need_split):
  392. path = video_path
  393. os.path.split(path)
  394. tur = os.path.split(path)
  395. name = tur[len(tur) - 1].split('.')[0]
  396. if (need_split == 1):
  397. c = split_video(video_path)
  398. process_photo(name, c)
  399. gather_video(video_path)
  400. do_analysis("./capture_image/" + name + "/capture_image{}-1.png.npy", video_path, mode)
  401. switch = {'jump': ignore_data_jump, # 注意此处不要加括号
  402. 'pingban': ignore_data_pingban,
  403. 'juanfu': ignore_data_juanfu,
  404. 'shendun': ignore_data_shendun,
  405. 'gaotaitui': ignore_data_gaotaitui,
  406. }
  407. choice = mode # 获取选择
  408. result, re = switch.get(choice, ignore_data_jump)(read2("./cap_file/" + name + "/file1.txt"))
  409. # 执行对应的函数,如果没有就执行默认的函数
  410. # result,re=ignore_data_juanfu(read2("./cap_file/"+name+"/file1.txt"))
  411. write1(result, "./cap_file/" + name + "/file3.txt")
  412. write1(re, "./cap_file/" + name + "-file.txt")
  413. # write1()
  414. return re
  415. if __name__ == '__main__':
  416. video_path = "./video/43.mp4"
  417. # path=video_path
  418. # os.path.split(path)
  419. # tur=os.path.split(path)
  420. # name=tur[len(tur)-1].split('.')[0]
  421. # c=split_video(video_path)
  422. # process_photo(name,c)
  423. # gather_video(video_path)
  424. # do_analysis("./capture_image/"+name+"/capture_image{}-1.png.npy",video_path,"shendun")
  425. # result,re=ignore_data_shendun(read2("./cap_file/"+name+"/file1.txt"))
  426. # write1(result,"./cap_file/"+name+"/file3.txt")
  427. # write1(re,"./cap_file/"+name+"-file.txt")
  428. # write1()
  429. # print(re)
  430. # re = run(video_path, "juanfu", 1)
  431. # 参数一 video_path
  432. # 参数二 shendun jump gaotaitui juanfu pingban
  433. # 第三个参数为1 表示需要视频切割