added video_threaded.py sample
authorAlexander Mordvintsev <no@email>
Thu, 24 May 2012 15:40:55 +0000 (15:40 +0000)
committerAlexander Mordvintsev <no@email>
Thu, 24 May 2012 15:40:55 +0000 (15:40 +0000)
samples/python2/video_threaded.py [new file with mode: 0644]

diff --git a/samples/python2/video_threaded.py b/samples/python2/video_threaded.py
new file mode 100644 (file)
index 0000000..6b2cdac
--- /dev/null
@@ -0,0 +1,63 @@
+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