Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.36 KB | None | 0 0
  1. class VideoHelper(object):
  2.  
  3. def __init__(self, video_file, frame_start=0, frame_end=np.float('inf'), do_loop=True, preload_frames=1000):
  4.  
  5. self.preloaded = False
  6. self.preload_frames = preload_frames
  7. self._init_capture(video_file, frame_start, frame_end)
  8. self.do_loop = do_loop
  9. self.paused = False
  10.  
  11. def restart_capture(self):
  12. self.curr_frame_idx = self.frame_start
  13.  
  14. def toggle_play(self):
  15. self.paused = not self.paused
  16.  
  17. def is_paused(self):
  18. return self.paused
  19.  
  20. def curr_frame_no(self):
  21. return self.curr_frame_idx-self.frame_start
  22.  
  23. def _init_capture(self, video_file, frame_start, frame_end):
  24.  
  25. self.video_file = video_file
  26. self.cap = cv2.VideoCapture(video_file)
  27.  
  28. if not self.cap.isOpened():
  29. raise RuntimeError("Failed to initialize capture for file {}".format(video_file))
  30.  
  31. self.n_orig_frames = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT))
  32. self.frame_start = max(frame_start, 0)
  33.  
  34. if frame_end < 0:
  35. self.frame_end = max(self.n_orig_frames+frame_end, self.frame_start)
  36. else:
  37. self.frame_end = min(self.n_orig_frames-1, frame_end)
  38.  
  39. self.curr_frame_idx = self.frame_start
  40.  
  41. self.n_frames = (self.frame_end - self.frame_start + 1)
  42.  
  43. if self.n_frames < self.preload_frames:
  44. self._preload()
  45.  
  46. def _preload(self):
  47.  
  48. self.frames = []
  49. self.preloaded = False
  50.  
  51. for frame_no in range(self.frame_start, self.frame_end+1):
  52. self.frames.append(self.get_frame_by_idx(frame_no))
  53.  
  54. self.preloaded = True
  55.  
  56. def is_finished(self):
  57. return self.curr_frame_idx > self.frame_end and not self.do_loop
  58.  
  59. def get_frame_by_idx(self, idx):
  60.  
  61. if self.preloaded:
  62. idx -= self.frame_start
  63. return self.frames[idx]
  64. else:
  65. self.cap.set(cv2.CAP_PROP_POS_FRAMES, idx)
  66. ret, frame = self.cap.read(1)
  67. if ret == False:
  68. raise RuntimeError("Failed to read frame no. {} from file {}".format(idx, self.video_file))
  69. return frame
  70.  
  71. def seek_next(self, skip=1):
  72.  
  73. self.curr_frame_idx += skip
  74.  
  75. if self.curr_frame_idx > self.frame_end and self.do_loop:
  76. self.curr_frame_idx = self.frame_start
  77.  
  78. def seek_prev(self, skip=1):
  79.  
  80. idx = max(self.frame_start, self.curr_frame_idx-skip)
  81. self.curr_frame_idx = idx
  82.  
  83. def curr_frame(self):
  84.  
  85. idx = self.curr_frame_idx
  86.  
  87. if idx > self.frame_end:
  88. raise RuntimeError('No more frames! You should have known earlier by calling is_finished()')
  89.  
  90. frame = self.get_frame_by_idx(idx)
  91. return frame
  92.  
  93. def next_frame(self, skip=1):
  94.  
  95. if self.paused:
  96. skip = 0
  97.  
  98. frame = self.curr_frame()
  99.  
  100. self.seek_next(skip)
  101.  
  102. return frame
  103.  
  104. def prev_frame(self, skip=1):
  105.  
  106. idx = max(self.frame_start, self.curr_frame_idx-skip)
  107. frame = self.get_frame_by_idx(idx)
  108. self.curr_frame_idx = idx
  109. return frame
  110.  
  111. def __del__(self):
  112. self.cap.release()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement