混淆Python多处理行为

时间:2016-10-04 14:37:43

标签: python opencv multiprocessing

我试图从USB相机中获取图像。

方法A: 如果我直接使用OpenCV访问相机,请执行以下操作:

import cv2
cam = cv2.VideoCapture(0)
while True:
    status, img = cam.read()
    if status:
        cv2.imshow("Cam", img)

我得到: ~3 FPS和我计算机的所有8个内核都以100%运行

方法B: 如果我使用Python的多处理库将其作为单独的进程运行,并将值作为多处理队列传递回主函数,如下所示:

from multiprocessing import Process, Lock, Queue
import cv2
def run(lock, queue, cam):
    while True:
        status, img = cam.read()
        if status:
            with lock:
                queue.put(img)
                if queue.qsize() > 10:
                    queue.get() # This is to prevent massive queue size
cam = cv2.VideoCapture(0)
lock = Lock()
queue = Queue()
p = Process(target = run, args = (lock, queue, cam)
p.start()
while True:
    with lock:
        if queue.qsize() > 0:
            img = queue.get()
            if img is not None:
                cv2.imshow("cam", img)

我得到: ~8 FPS,我的电脑只有1个核心以100%运行。所有其他核心都接近0%。

但对我来说最奇怪的是,如果我首先将其作为一个单独的过程(方法B)运行,然后在同一程序中直接访问摄像机(方法A),如下所示:

#Approach B
#Release B's connection to the camera
#Terminate and join B's process
#Approach A

我得到: ~13 FPS,我的计算机只有1个内核运行在接近100%。所有其他核心都接近0%。

那么,如何在不必首先创建和销毁当时不必要的进程的情况下,仅使用一个核心来获得最终的~13 FPS?我将方法B的~8 FPS归因于冲突的锁定。但我不明白为什么方法A从一开始就不是13 FPS。

谢谢!

对于上下文,这是在运行Ubuntu 15.10的8核ARM处理器上运行。

0 个答案:

没有答案