如何使用 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 标准模块 - numpy
和 pil/pillow
或 cv
用于图像转换,dill
或 pickle
用于 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
进行图像发送以及一些性能调整提示以供进一步思考。
我有一个 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 标准模块 - numpy
和 pil/pillow
或 cv
用于图像转换,dill
或 pickle
用于 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
进行图像发送以及一些性能调整提示以供进一步思考。