我使用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时,我向主进程发送一个信号以保存当前帧。
我尝试使用multiprocessing
和pipe
,如:
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时才通知主进程的方法?