From eb28bef2dbe6dfb818e84f289ab0face4bfcb7b1 Mon Sep 17 00:00:00 2001 From: Alexander Mordvintsev Date: Thu, 24 May 2012 15:40:55 +0000 Subject: [PATCH] added video_threaded.py sample --- samples/python2/video_threaded.py | 63 +++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 samples/python2/video_threaded.py diff --git a/samples/python2/video_threaded.py b/samples/python2/video_threaded.py new file mode 100644 index 0000000000..6b2cdacefd --- /dev/null +++ b/samples/python2/video_threaded.py @@ -0,0 +1,63 @@ +import numpy as np +import cv2 + +from Queue import Queue +from threading import Thread +from collections import deque + +class Worker(Thread): + def __init__(self, tasks): + Thread.__init__(self) + self.tasks = tasks + self.daemon = True + self.start() + + def run(self): + while True: + func, args, kargs = self.tasks.get() + try: func(*args, **kargs) + except Exception, e: print e + self.tasks.task_done() + +class ThreadPool: + def __init__(self, num_threads): + self.tasks = Queue(num_threads) + for _ in range(num_threads): Worker(self.tasks) + + def add_task(self, func, *args, **kargs): + self.tasks.put((func, args, kargs)) + + def wait_completion(self): + self.tasks.join() + +if __name__ == '__main__': + results = deque() + + def process_frame(i, frame): + global results + res = cv2.medianBlur(frame, 15) + results.append((i, res)) + + pool = ThreadPool(4) + cap = cv2.VideoCapture(0) + frame_count = 0 + last_frame = None + last_count = -1 + while True: + ret, frame = cap.read() + pool.add_task(process_frame, frame_count, frame.copy()) + frame_count += 1 + while len(results) > 0: + i, frame = results.popleft() + if i > last_count: + last_count, last_frame = i, frame + if last_frame is not None: + cv2.imshow('res', last_frame) + if cv2.waitKey(1) == 27: + break + + pool.wait_completion() + + + +