管道摄像机输出到两个工序



我有以下问题:我们希望使用raspi相机的输出作为两个不同进程的输入数据。一个通过RF链路发送相机数据,另一个应该使用opencv进行一些图像处理

:

#read camera stream using raspivid
raspivid_comm = ["raspivid", "-w", str(width), "-h", str(height), "-fps", str(fps), "-b", str(video_bitrate),
"-g", str(keyframerate), "-t", "0"]
raspivid_comm.extend(extraparams.split())
raspivid_comm.extend(["-o", "-"])
raspivid_task = Popen(raspivid_comm, stdout=subprocess.PIPE, stdin=None, stderr=None, close_fds=True,
shell=False, bufsize=0)

其他两个进程应使用与输入

相同的粗体
send_task = Popen(send_via_rf, stdout=None, stdin=raspivid_task.stdout , stderr=None, close_fds=True,
shell=False, bufsize=0)

improc_task = Popen(improc, stdout=None, stdin=raspivid_task.stdout , stderr=None, close_fds=True,
shell=False, bufsize=0)

但是问题是两个进程(raspivid_task.stdout)读取相同的管道不工作。是否有可能在python中复制输出管道?比如命令"tee"?

将一个程序的输出发送给另外两个程序的经典方法是使用tee"进程替换">,像这样:

raspivid | tee >(processA) | processB
然而,这些都在"锁步骤">中,所以这取决于您希望/需要的"耦合">的程度。如果射频链路断开或锁定,如果图像处理也停止是可以的吗?反过来呢?这还取决于您是否能够处理图像处理或RF链路丢失的一两帧。

最简单的方法是,如果一切都是解耦的。所以你有一个进程从相机读取视频帧并将它们放入Redis或者多进程共享内存,越快越好。然后你有你的图像处理运行在一个单独的,独立的进程,读取帧从Redis或共享内存尽可能快,同样地,另一个进程从共享内存或Redis读取尽可能快,并通过无线电链路发送帧。