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

时间:2019-02-13 10:02:40

标签: python image sockets opencv gstreamer

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

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

关键是图像发送。

首先从某些背景开始,图像是* 640 * 480 jpeg *文件。 JPEG被选为默认选项,但也可以选择较低质量的编码。它们由相机顺序捕获。因此,我们大约有〜600帧要发送。帧大小约为110KiB。

客户端由Raspberry Pi 3 B +模型组成。它通过wifi将帧发送到5c服务器。服务器和客户端都位于原型版本的同一LAN中。但是就连接介质(有线或无线)和区域(LAN或城域)而言,未来的部署可能会有所不同。

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

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

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

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

所有关于此事的个人研究都使我使用Python套接字或与上下文无关(依赖于纯Python之外的其他后端)找到与我的解决方案类似的解决方案。

通过一种更好的方法,我认为:

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

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

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

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

1 个答案:

答案 0 :(得分:1)

如果要将图像作为帧传输,可以使用一些现有的应用程序,例如MJPEG-Streamer,它将来自网络摄像头界面的图像编码为JPG,从而减​​小图像尺寸。但是,如果您需要使用高级编码进行更可靠的传输,则可以使用here中记录的一些Linux工具,例如FFMPEG进行流传输。

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

如果您不想流式传输,则可以将整个图像集转换为h264之类的视频编码格式,然后通过字节传输网络。您可以使用opencv来执行此操作。 还有一些用python编写的好的库,例如pyffmpeg