使用Python + OpenCV多进程应用程序防止相机滞后

时间:2019-07-10 13:57:46

标签: python-2.7 opencv ubuntu image-processing multiprocessing

我有一个使用OpenCV和USB摄像头进行实时视频处理的Python应用程序。相机每秒获取30帧。图像处理在两个不同的内核上并行执行,每个内核约8 FPS,总吞吐量约为16 FPS。

我用主进程写入的大小为1的队列实现了此代码。现在的问题是,如其他问题(如here所述),摄像机图像在用VideoCapture.read()读取之前被存储在固定大小的FIFO缓冲区中,从而导致某些应用程序出现滞后。使用相机时,我无法控制此缓冲区。因此,由于缓冲区的填充率较高,因此发送到子进程的图像不是最新的图像。

我通过每次迭代跳过一帧来解决此问题。但是,新的获取速率与算法吞吐量不完全相同。而且,算法速度将来可能会改变。如何确保相机缓冲区始终为空,以防止意外的延迟?

from multiprocessing import Process, Queue
import cv2
import os

VIDEO_DEVICE = 0
SKIP_N_FRAMES = 1

def img_process(img_queue):     

    while True:         
        img = img_queue.get()
        do_some_processing(img)         


def get_frame(cap):

    # skip one frame
    for i in range(SKIP_N_FRAMES):
        cap.grab()  

    retval, frame = cap.read() 

    return frame

if __name__ == '__main__':

    img_queue = Queue(1)    
    cap = cv2.VideoCapture(VIDEO_DEVICE)

    p1 = Process(target=img_process, args=(img_queue,))
    p2 = Process(target=img_process, args=(img_queue,))

    p1.start()
    p2.start()
    # assign the processes to separate cores
    os.system("taskset -p -c %d %d" % (4, p1.pid))
    os.system("taskset -p -c %d %d" % (5, p2.pid))


    while cap.isOpened():

        frame = get_frame(cap)              
        img_queue.put(frame)            

    p1.terminate()
    p2.terminate()

0 个答案:

没有答案