首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将摄像机输出通过管道传输到两个进程

将摄像机输出通过管道传输到两个进程
EN

Stack Overflow用户
提问于 2021-10-23 11:54:07
回答 1查看 64关注 0票数 0

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

如下所示:

代码语言:javascript
复制
    #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作为输入

代码语言:javascript
复制
    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"?

EN

回答 1

Stack Overflow用户

发布于 2021-10-23 20:56:37

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

代码语言:javascript
复制
raspivid | tee >(processA) | processB

然而,这一切都在“锁定步骤”中,所以这取决于你想要/需要的东西的“耦合”程度。如果RF链路中断或锁定,图像处理是否也可以停止?另一种方式呢?它还取决于您是否能够处理图像处理或RF链接中丢失的一两帧。

要做到这一点,最简单的方法是将所有内容都解耦。因此,您有一个从摄像头读取视频帧并尽快将其放入、Redis、或多处理共享内存的进程。然后,您的图像处理在一个单独的、独立的进程中运行,该进程以其所需的速度从Redis或共享内存中读取帧,同样地,另一个进程以其所需的速度从共享内存或Redis中读取帧,并通过无线电链路将帧发送出去。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69687899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档