Some reading on the subject:
https://docs.python.org/2/library/multiprocessing.html
http://pymotw.com/2/multiprocessing/index.html
And basic working version of OpenCV with multiprocessing for a webcam capture using pipes:
import multiprocessing import cv2 def cam_loop(pipe_parent): cap = cv2.VideoCapture(0) while True: _ , img = cap.read() if img is not None: pipe_parent.send(img) def show_loop(pipe_child): cv2.namedWindow('pepe') while True: from_queue = pipe_child.recv() cv2.imshow('pepe', from_queue) cv2.waitKey(1) if __name__ == '__main__': logger = multiprocessing.log_to_stderr() logger.setLevel(multiprocessing.SUBDEBUG) pipe_parent, pipe_child = multiprocessing.Pipe() cam_process = multiprocessing.Process(target=cam_loop,args=(pipe_parent, )) cam_process.start() show_process = multiprocessing.Process(target=show_loop,args=(pipe_child, )) show_process.start() cam_process.join() show_loop.join()This code will create one main process and two child ones, one for each function, plus a pipe that is how the images that one captures, the other consumes.
What about using a queue?:
import multiprocessing import cv2 def cam_loop(the_q): cap = cv2.VideoCapture(0) while True: _ , img = cap.read() if img is not None: the_q.put(img) def show_loop(the_q): cv2.namedWindow('pepe') while True: from_queue = the_q.get() cv2.imshow('pepe', from_queue) cv2.waitKey(1) if __name__ == '__main__': logger = multiprocessing.log_to_stderr() logger.setLevel(multiprocessing.SUBDEBUG) the_q = multiprocessing.Queue() cam_process = multiprocessing.Process(target=cam_loop,args=(the_q, )) cam_process.start() show_process = multiprocessing.Process(target=show_loop,args=(the_q, )) show_process.start() cam_process.join() show_loop.join()
The memory of cam_loop child process will grow and grow without limit. My educated guess is that the queue has no limit, so it will just get fatter until it eats all system memory.
How to fix this? limiting the size of the queue at instantiation moment:
the_q = multiprocessing.Queue(1)Warning!!!: the bigger the int, the more lag is added to the web capture... it-is-spooky!
Next: compare performance with shared memory.
Warning!:
cv2.waitKey(
1
)
A good deal of time can be spent troubleshooting if you forget this, that allows the opencv to process events.
Thanks alot!
ReplyDelete