--- /dev/null
+import numpy as np\r
+import cv2\r
+\r
+from Queue import Queue\r
+from threading import Thread\r
+from collections import deque\r
+\r
+class Worker(Thread):\r
+ def __init__(self, tasks):\r
+ Thread.__init__(self)\r
+ self.tasks = tasks\r
+ self.daemon = True\r
+ self.start()\r
+ \r
+ def run(self):\r
+ while True:\r
+ func, args, kargs = self.tasks.get()\r
+ try: func(*args, **kargs)\r
+ except Exception, e: print e\r
+ self.tasks.task_done()\r
+\r
+class ThreadPool:\r
+ def __init__(self, num_threads):\r
+ self.tasks = Queue(num_threads)\r
+ for _ in range(num_threads): Worker(self.tasks)\r
+\r
+ def add_task(self, func, *args, **kargs):\r
+ self.tasks.put((func, args, kargs))\r
+\r
+ def wait_completion(self):\r
+ self.tasks.join()\r
+\r
+if __name__ == '__main__':\r
+ results = deque()\r
+\r
+ def process_frame(i, frame):\r
+ global results\r
+ res = cv2.medianBlur(frame, 15)\r
+ results.append((i, res))\r
+ \r
+ pool = ThreadPool(4)\r
+ cap = cv2.VideoCapture(0)\r
+ frame_count = 0\r
+ last_frame = None\r
+ last_count = -1\r
+ while True:\r
+ ret, frame = cap.read()\r
+ pool.add_task(process_frame, frame_count, frame.copy())\r
+ frame_count += 1\r
+ while len(results) > 0:\r
+ i, frame = results.popleft()\r
+ if i > last_count:\r
+ last_count, last_frame = i, frame\r
+ if last_frame is not None:\r
+ cv2.imshow('res', last_frame)\r
+ if cv2.waitKey(1) == 27:\r
+ break\r
+\r
+ pool.wait_completion()\r
+\r
+\r
+\r
+\r