如何使用 ZeroMQ 通过 TCP 套接字发送 PNG 图像?

How can I send PNG image over TCP sockets using ZeroMQ?

我有一个 Keras 模型在 Python 上工作,我想从 Unity 3D 相机向这个模型发送帧。我可以使用外部库轻松地在它们之间传输字符串。这个外部库发送一个字节数组到 Python。因此,我将 Unity 的相机帧转换为字节数组。但是,我不知道如何读取 Python.

上发送的图像(字节数组)

为了解决这个问题,我尝试了一些仅使用 Python 的发送方-接收方代码。但是,这些都不起作用。

代码如下:

发件人:

import zmq
import base64


context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

f = open("sample.png", 'rb')
bytes = bytearray(f.read())
strng = base64.b64encode(bytes)
socket.send(strng)
f.close()

接收方:

import zmq
import base64


context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")

import base64
message = socket.recv()
f = open("sample.png", 'wb')
ba = bytearray(base64.b64decode(message))
f.write(ba)
f.close()

这是将帧从 Unity 发送到 Python 的好方法吗?或者还有其他方法吗?我该如何处理我的问题?上面的代码有什么问题?

Q : "Is that a good way for sending frames from Unity to Python?"

我敢说

However, I do not know how to read the sent images (byte array) on Python.

为什么有人会使用一种工具来“编码”某些东西,
而没有匹配工具来"解码"?


Q : "Or are there other ways?"

哦,当然有。


Q : "How can I handle my problem?"

最好学习此类工具,您可以在编码和解码阶段安全地使用这些工具。许多可用的 Python 标准模块 - numpypil/pillow cv 用于图像转换,dillpickle 用于 SER/DES 甚至 struct.

使用这些工具 多年以来,使用安全工具朝着正确的方向前进。


Q : "What is wrong with the codes above?"

这永远不会飞。

“发件人”,
已被提议作为 REP-实例永远无法启动调用 .send() 方法。
从不。

“Receiver”,
已被提议作为 REQ-实例永远无法启动调用 .recv() 方法。
从不。

听起来很复杂?是的,REQ/REP的选择不是我的。

ZeroMQ REQ/REP 正式的可扩展通信原型是最复杂的原型之一(操作内部分布式有限状态自动机 (dFSA),实际上 1:N 其中,没有风险,但可以肯定的是,这些 N dFSA 中的任何一个都会陷入无法挽救的自我僵局,故事就结束了……)

不要误会我的意思,我从那时起就喜欢 ZeroMQ,并且钦佩 Pieter HINTJENS 和 Martin SUSTRIK 的大量发明和性能改进,他们已经融入 ZeroMQ 的零之禅,但我试着警告你它需要一些时间掌握禅从头到尾。

上面的 link 有一个完整的解决方案,而不是使用 PUB/SUB 进行图像发送以及一些性能调整提示以供进一步思考。