我有以下问题:我们想使用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)另外两个进程应该使用相同的stout作为输入
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"?
发布于 2021-10-23 20:56:37
将一个程序的输出发送给另外两个程序的经典方法是使用tee和“进程替换”,如下所示:
raspivid | tee >(processA) | processB然而,这一切都在“锁定步骤”中,所以这取决于你想要/需要的东西的“耦合”程度。如果RF链路中断或锁定,图像处理是否也可以停止?另一种方式呢?它还取决于您是否能够处理图像处理或RF链接中丢失的一两帧。
要做到这一点,最简单的方法是将所有内容都解耦。因此,您有一个从摄像头读取视频帧并尽快将其放入、Redis、或多处理共享内存的进程。然后,您的图像处理在一个单独的、独立的进程中运行,该进程以其所需的速度从Redis或共享内存中读取帧,同样地,另一个进程以其所需的速度从共享内存或Redis中读取帧,并通过无线电链路将帧发送出去。
https://stackoverflow.com/questions/69687899
复制相似问题