Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.17 KB | None | 0 0
  1. import cv2
  2. import numpy as np
  3. import json
  4. import os
  5. #10 - фигурирует как константа для максимального числа голов
  6. check_glob = 0
  7. g = np.array([-1 for i in range(10)])
  8.  
  9.  
  10. def find(path, number):
  11. return os.path.isfile(make_name(path, number))
  12.  
  13.  
  14. def make_name(path, number):
  15. s = str(number)
  16. k = len(s)
  17. zer = ''
  18. for i in range(0, 6 - k):
  19. zer += '0'
  20. end = 'rc.jpg.json'
  21. res = path + zer + s + end
  22. return res
  23.  
  24.  
  25. def find_head(path, number=-1):
  26. if number != -1:
  27. path = make_name(path, number)
  28. with open(path) as json_data:
  29. d = json.load(json_data)
  30. d1 = d['objects']
  31. h = []
  32. dig = -1
  33. for i in d1:
  34. for j in i['tags']:
  35. if j.isdigit():
  36. dig = int(j)
  37. if j == 'h':
  38. h.append([i['data'], dig])
  39. h1 = np.array(h)
  40. return h1
  41.  
  42.  
  43. def give_cur_heads(ans):#скорее всего тут умирает, но я пытался...
  44. seq = []
  45. for i in ans:
  46. seq.append(i[1])
  47. return seq
  48.  
  49.  
  50. def compare(roi, ans):
  51. size = ans.shape[0]
  52. seq = give_cur_heads(ans)
  53. ans = fulfil_ans(ans)
  54. res = []
  55. print(seq)
  56. if size == 1:
  57. print("********")
  58. #print(roi)
  59. print(len(roi))
  60. print(g[seq[0]])
  61. return compare_head(roi[g[seq[0]]], ans)
  62. for i in range(size):
  63. num_head = g[seq[i]]
  64. print("Number of head", num_head)
  65. res.append(compare_head(roi[num_head], ans[i]))
  66. return np.array(res)
  67.  
  68.  
  69. def get_res(res):
  70. return res
  71.  
  72.  
  73. def compare_head(track, ans):
  74. s_track = set()
  75. s_ans = set()
  76. print(track.shape)
  77. for i in track:
  78. for j in i:
  79. x, y = j
  80. s_track.add((int(x), int(y)))
  81. for i in ans:
  82. for j in i:
  83. x, y = j
  84. s_ans.add((int(x), int(y)))
  85. s_dif = s_ans & s_track
  86. return get_res(s_dif)
  87.  
  88.  
  89. def upd(roi, flow):
  90. global check_glob
  91. if not check_glob:
  92. return roi
  93. if len(roi) == 1: # only one head
  94. roi[0] = upd_head(roi[0], flow)
  95. return roi
  96. for i in range(len(roi)):
  97. roi[i] = upd_head(roi[i], flow)
  98. return roi
  99.  
  100.  
  101. def upd_head(roi_head, flow):
  102. for i in range(roi_head.shape[0]):
  103. for j in range(roi_head.shape[1]):
  104. roi_head[i][j] = upd_cell(roi_head[i][j], flow)
  105. return np.array(roi_head)
  106.  
  107.  
  108. def upd_cell(cell, flow): #we think that in json y, x not x, y
  109. y = cell[0]
  110. x = cell[1]
  111. cell[0] += flow[y][x][1]
  112. cell[1] += flow[y][x][0]
  113. return cell
  114.  
  115.  
  116. def fulfil(roi_border): #we think that in json y, x not x, y in fact, initialize empty roi/ans
  117. if roi_border.shape[0] == 0:
  118. return
  119. if roi_border.shape[0] == 1:
  120. global check_glob
  121. check_glob = 1
  122. g[roi_border[0][1]] = 0
  123. roi = []
  124. roi.append(fulfil_ins(roi_border[0]))
  125. return roi
  126. ans = []
  127. for i in roi_border:
  128. check_glob = 1
  129. ans.append(fulfil_ins(i))
  130. g[i[1]] = len(ans) - 1
  131. return ans
  132.  
  133.  
  134. def fulfil_ans(roi_border): #we think that in json y, x not x, y in fact, initialize empty roi/ans
  135. if roi_border.shape[0] == 0:
  136. return
  137. if roi_border.shape[0] == 1:
  138. return fulfil_ins(roi_border[0])
  139. ans = []
  140. for i in roi_border:
  141. ans.append(fulfil_ins(i))
  142. return np.array(ans)
  143.  
  144.  
  145. def fulfil_ins(roi_border): #we think that in json y, x not x
  146. x1, y1, x2, y2 = roi_border[0]
  147. ind = 0
  148. res = []
  149. for i in range(int(x2), int(x1 + 1), 1): #round to int real values!!!
  150. row = []
  151. for j in range(int(y2), int(y1 + 1), 1):
  152. row.append([j, i])
  153. ind += 1
  154. res.append(row)
  155. return np.array(res)
  156.  
  157.  
  158. def add_head(roi, path):
  159. h = find_head(path)
  160. global check_glob
  161. if not check_glob:
  162. check_glob = 1
  163. return fulfil(h)
  164. for i in range(h.shape[0]):# suppose, problems here....
  165. num = h[i][1]
  166. print(h.shape)
  167. print(h)
  168. if g[num] == -1:
  169. roi.append(fulfil_ins(h[i]))
  170. g[h[i][1]] = len(roi) - 1
  171. return roi
  172.  
  173.  
  174. def check_new_head(roi, path_js, ind, ans):
  175. path = make_name(path_js, ind)
  176. global check_glob
  177. if not check_glob:
  178. roi = add_head(roi, path)
  179. return roi
  180. seq = give_cur_heads(ans)
  181. print(seq)
  182. for i in seq:
  183. if g[i] == -1:
  184. roi = add_head(roi, path)
  185. break
  186. return roi
  187.  
  188.  
  189. def track_head(path_vid, path_js):
  190. cap = cv2.VideoCapture(path_vid)
  191. ret, frame1 = cap.read()
  192. roi = []
  193. roi_border = find_head(path_js, 0)
  194. #roi.append(fulfil(roi_border)) для 1 кадра с головами не работает
  195. prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
  196. ind = 1
  197. test = []
  198. while (1):
  199. ret, frame2 = cap.read()
  200. next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
  201. flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
  202. roi = upd(roi, flow)
  203. if find(path_js, ind):
  204. ans = find_head(path_js, ind)
  205. roi = check_new_head(roi, path_js, ind, ans)
  206. test.append(compare(roi, ans))
  207. print(ind)
  208. if ind == 401:
  209. break
  210. ind += 1
  211. k = cv2.waitKey(30) & 0xff #несколько странная остановка, но вроде работала...
  212. if k == 27:
  213. break
  214. return test
  215.  
  216.  
  217. path = "/Users/denissurin/Downloads/Telegram Desktop/video_2018-07-13_15-56-11.mp4"
  218. path1 = "/Users/denissurin/Downloads/OneDrive-2018-07-18/real2.avi"
  219. path2 = "/Users/denissurin/Downloads/OneDrive-2018-07-18/record-0000-004C-20180505193003-20180505193014.avi"
  220. path3 = "/Users/denissurin/Downloads/OneDrive-2018-07-18/VNG_180621_3730.avi"
  221. path_to_json = "/Users/denissurin/Downloads/GPN_180319_6103/"
  222. path_to_video = "/Users/denissurin/Downloads/GPN_180319_6103.mp4"
  223. #track_green_circle(path)
  224. # track_map(path3)
  225. test = track_head(path_to_video, path_to_json)
  226. for i in test:
  227. print(len(i))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement