video_threaded.py sample now uses multiprocessing module's ThreadPool
This commit is contained in:
parent
a71e690b5e
commit
6116049225
@ -1,63 +1,29 @@
|
||||
import numpy as np
|
||||
import cv2
|
||||
|
||||
from Queue import Queue
|
||||
from threading import Thread
|
||||
from multiprocessing.pool import ThreadPool
|
||||
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(frame):
|
||||
# some intensive computation...
|
||||
frame = cv2.medianBlur(frame, 19)
|
||||
frame = cv2.medianBlur(frame, 19)
|
||||
frame = cv2.medianBlur(frame, 19)
|
||||
return frame
|
||||
|
||||
def process_frame(i, frame):
|
||||
global results
|
||||
res = cv2.medianBlur(frame, 15)
|
||||
results.append((i, res))
|
||||
|
||||
pool = ThreadPool(4)
|
||||
threadn = 8
|
||||
cap = cv2.VideoCapture(0)
|
||||
frame_count = 0
|
||||
last_frame = None
|
||||
last_count = -1
|
||||
pool = ThreadPool(processes = threadn)
|
||||
pending = deque()
|
||||
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)
|
||||
while len(pending) > 0 and pending[0].ready():
|
||||
res = pending.popleft().get()
|
||||
cv2.imshow('result', res)
|
||||
if len(pending) < threadn+1:
|
||||
ret, frame = cap.read()
|
||||
task = pool.apply_async(process_frame, (frame.copy(),))
|
||||
pending.append(task)
|
||||
if cv2.waitKey(1) == 27:
|
||||
break
|
||||
|
||||
pool.wait_completion()
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user