python - 从客户端向服务器发送大量图像的有效方法

标签 python image sockets opencv gstreamer

我正在做一个项目,其中一个客户需要从相机拍摄多张快照(即它实际上拍摄的是短时视频,因此是帧流),然后将所有图像发送到服务器 然后对这些图像执行一些处理并将结果返回给客户端。

客户端和服务器都在运行 Python3 代码。

关键部分是图片发送部分。

先放一些背景,图片是 *640*480 jpeg* 文件。 JPEG 被选为默认选项,但也可以选择较低质量的编码。它们被相机按顺序拍摄。因此,我们大约有 ~600 帧要发送。帧大小约为 110KiB。

客户端由 Raspberry Pi 3 型号 B+ 组成。它通过 wifi 将帧发送到 5c 服务器。对于原型(prototype)版本,服务器和客户端都位于同一个 LAN 中。但 future 的部署可能会有所不同,无论是在连接介质(有线或无线)还是区域(LAN 或城域网)方面。

我已经为此实现了几种解决方案:

  1. 在服务器和客户端上使用 Python 套接字:我要么在捕获一帧后直接发送一帧,要么发送所有图像按顺序在整个流捕获完成后。

  2. 使用 Gstreamer:我在我的客户端上启动一个 GStreamer 端点,并在我流式传输时直接将帧发送到服务器。我使用在 GStreamer 支持下编译的 OpenCV 在服务器端捕获流,然后将它们保存到磁盘。

现在,我面临的问题是,即使这两种解决方案都能“很好”地工作(它们完成了“最终”工作,即将数据发送到服务器并接收基于某些远程处理的结果),我相信有更好的方法可以使用 Python 套接字库或任何其他可用工具将大量数据发送到服务器。

所有关于这个问题的个人研究都让我找到了与我类似的解决方案,使用 Python 套接字,或者脱离上下文(依赖于纯 Python 以外的其他后端)。

通过更好的方式,我假设:

  1. 尽可能节省带宽的解决方案。
  2. 一种尽快发送所有数据的解决方案。

对于 1. 我稍微修改了我的第一个解决方案,将所有捕获的帧存档并压缩到我发送到服务器的 .tgz 文件中。它确实减少了带宽使用,但也增加了两端花费的时间(由于解压缩过程)。当数据集很大时,这显然尤其如此。

对于 2。GStreamer 允许我在我的服务器上的捕获和接收之间有一个可以忽略不计的延迟。然而,我根本没有压缩,并且由于上述原因,我不能真正使用这个库进行进一步的开发。

如何在 Python 中以最少的带宽使用和延迟将大量图像从一个客户端发送到一个服务器?

最佳答案

如果您想将图像作为帧传输,您可以使用一些现有的应用程序,例如 MJPEG-Streamer它将来自网络摄像头界面的图像编码为 JPG 以减小图像大小。但是,如果您需要使用高级编码进行更稳健的传输,您可以使用一些 Linux 工具,如 FFMPEG 和流式传输,这在 here 中有记录。 .

如果您想要较低的实现并通过您的代码控制整个流以进行修改,您可以使用基于网络的框架,如 Flask 并直接通过 HTTP 协议(protocol)传输图像。您可以在 here 中找到一个很好的例子.

如果你不想流式传输,你可以将一整套图像转换为视频编码格式,如 h264,然后传输字节到网络。您可以使用 opencv 来执行此操作。 还有一些用 python 编写的不错的库,如 pyffmpeg .

关于python - 从客户端向服务器发送大量图像的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54667373/

相关文章:

java - 如何在 ListView 中通知数据集正确更改

Java线程监听套接字,WHILE循环不等待

c# - C# (.net) 下带有 HTTP 服务器的 Keep-Alive 套接字如何发送多个查询?

python - 使用 zoomed_inset_axes 截断框

python - 如何在 Python 中访问索引、键和值

mysql - 为什么我的图像存储为 MySQL longblobs 仅部分显示?

javascript - 是否可以在没有表单的情况下通过 JS 发布文件?

python - 下面的 LP 代码哪里出错了?

python - Matplotlib -- libpng 错误 : Incompatible libpng version in application and library

java - 使用 readDouble 从套接字输入读取 Double + EOL