我试图从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处理器上运行。