如何使用Opencv以事件驱动的方式处理帧

时间:2016-03-12 21:55:06

标签: python opencv multiprocessing event-driven

我使用Opencv来显示实时帧,当远程标志变量(在这种情况下保存在firebase中)从False变为True时,程序会保存当前帧。但是轮询标志值会使程序变慢并且帧不能平滑显示。所以我想知道是否可以使它"事件驱动"。

这是我想要做的: 一个进程捕获帧并显示它们,如:

cap = cv2.VideoCapture(0)
while(True):
    ret, frame = cap.read()
    frame = cv2.flip(frame,1)
    # Display the resulting frame
    cv2.imshow('frame',frame)

另一个进程获取变量值,当它等于True时,我向主进程发送一个信号以保存当前帧。

我尝试使用multiprocessingpipe,如:

def is_asked(conn):
    while(True):
        isAsked = firebase.get('/test/isAsked', None)        
        conn.send(isAsked)


if __name__ == '__main__':    
    parent_conn, child_conn = Pipe()
    p = Process(target=is_asked, args=(child_conn,))
    p.start()
    cap = cv2.VideoCapture(0)
    while(True):
        ret, frame = cap.read()
        frame = cv2.flip(frame,1)
        # Display the frame
        cv2.imshow('frame',frame)

        recvSignal = parent_conn.recv()
        print recvSignal
        if cv2.waitKey(1) & recvSignal == True:
           ## do something like take screenshot

    cap.release()
    cv2.destroyAllWindows()
    p.join()    

但后来我意识到parent_conn.recv() send()可能会被is_asked阻止,它与直接轮询没有多大区别。

有没有"事件驱动"只有当变量变为True时才通知主进程的方法?

0 个答案:

没有答案