【问题标题】:Piping camera output to two processes管道摄像机输出到两个进程
【发布时间】:2021-12-09 17:58:13
【问题描述】:

我有以下问题: 我们想使用 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”?

【问题讨论】:

    标签: python image opencv raspberry-pi pipe


    【解决方案1】:

    将一个程序的输出发送给另外两个程序的经典方法是使用tee“进程替换”,如下所示:

    raspivid | tee >(processA) | processB
    

    然而,这一切都在“锁定步骤”中,所以这取决于你想要/需要的东西如何“耦合”。如果 RF 链路出现故障或锁定,图像处理也停止是否可以?反过来呢?这还取决于您是否可以处理图像处理或射频链路丢失一帧或两帧的情况。

    最简单的方法是一切都解耦。因此,您有一个进程可以从摄像头读取视频帧并将它们尽快放入 Redis 或多处理共享内存中。然后您的图像处理运行在一个单独的、独立的进程中,该进程尽可能快地从 Redis 或共享内存中读取帧,同样,另一个进程从共享内存或 Redis 中读取帧尽可能快地通过无线电链路发送帧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      • 2010-11-20
      相关资源
      最近更新 更多