Home | History | Annotate | Download | only in python2
      1 #!/usr/bin/env python
      2 
      3 '''
      4 Multithreaded video processing sample.
      5 Usage:
      6    video_threaded.py {<video device number>|<video file name>}
      7 
      8    Shows how python threading capabilities can be used
      9    to organize parallel captured frame processing pipeline
     10    for smoother playback.
     11 
     12 Keyboard shortcuts:
     13 
     14    ESC - exit
     15    space - switch between multi and single threaded processing
     16 '''
     17 
     18 
     19 import numpy as np
     20 import cv2
     21 
     22 from multiprocessing.pool import ThreadPool
     23 from collections import deque
     24 
     25 from common import clock, draw_str, StatValue
     26 import video
     27 
     28 
     29 class DummyTask:
     30     def __init__(self, data):
     31         self.data = data
     32     def ready(self):
     33         return True
     34     def get(self):
     35         return self.data
     36 
     37 if __name__ == '__main__':
     38     import sys
     39 
     40     print __doc__
     41 
     42     try:
     43         fn = sys.argv[1]
     44     except:
     45         fn = 0
     46     cap = video.create_capture(fn)
     47 
     48 
     49     def process_frame(frame, t0):
     50         # some intensive computation...
     51         frame = cv2.medianBlur(frame, 19)
     52         frame = cv2.medianBlur(frame, 19)
     53         return frame, t0
     54 
     55     threadn = cv2.getNumberOfCPUs()
     56     pool = ThreadPool(processes = threadn)
     57     pending = deque()
     58 
     59     threaded_mode = True
     60 
     61     latency = StatValue()
     62     frame_interval = StatValue()
     63     last_frame_time = clock()
     64     while True:
     65         while len(pending) > 0 and pending[0].ready():
     66             res, t0 = pending.popleft().get()
     67             latency.update(clock() - t0)
     68             draw_str(res, (20, 20), "threaded      :  " + str(threaded_mode))
     69             draw_str(res, (20, 40), "latency        :  %.1f ms" % (latency.value*1000))
     70             draw_str(res, (20, 60), "frame interval :  %.1f ms" % (frame_interval.value*1000))
     71             cv2.imshow('threaded video', res)
     72         if len(pending) < threadn:
     73             ret, frame = cap.read()
     74             t = clock()
     75             frame_interval.update(t - last_frame_time)
     76             last_frame_time = t
     77             if threaded_mode:
     78                 task = pool.apply_async(process_frame, (frame.copy(), t))
     79             else:
     80                 task = DummyTask(process_frame(frame, t))
     81             pending.append(task)
     82         ch = 0xFF & cv2.waitKey(1)
     83         if ch == ord(' '):
     84             threaded_mode = not threaded_mode
     85         if ch == 27:
     86             break
     87 cv2.destroyAllWindows()
     88