我有一个在 Python 上工作的 Keras 模型,我想从 Unity 3D 相机向这个模型发送帧。我可以通过使用外部库轻松地在它们之间传输字符串。这个外部库向 Python 发送一个字节数组。因此,我将 Unity 的相机帧转换为字节数组。但是,我不知道如何在 Python 上读取发送的图像(字节数组)。
为了解决这个问题,我尝试了一些仅使用 Python 的 Sender-Receiver 代码。然而,那些没有奏效。
以下是代码:
发件人:
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
.已经使用了这些年with ZeroMQ, you may be sure使用安全工具朝着正确的方向前进。
Q : "What is wrong with the codes above?"
这永远不会飞。
“发件人”,已被提议为
REP
-instance 永远不能以调用 开始.send()
-方法。从不。“接收者”已被提议为
REQ
-instance 永远不能以调用 开始.recv()
-方法。从不。听起来很复杂?是的,
REQ/REP
的选择不是我的。零MQ
REQ/REP
形式化可扩展通信原型(prototype)是最复杂的原型(prototype)之一(运行内部分布式有限状态自动机(dFSA),实际上是其中的 1:N,没有风险,但可以确定不可挽救的自死锁中的任何一个这些 N dFSA 和故事结束了......)不要误会我的意思,我从那时起就喜欢 ZeroMQ,并钦佩 Pieter HINTJENS 和 Martin SUSTRIK 的大量发明和性能改进,他们已经融入了 ZeroMQ 的“零之禅”,但我尝试提醒您,要掌握禅从头到尾。
上面的链接有一个完整的解决方案,而不是使用
PUB/SUB
用于图像发送以及一些性能调整提示以供进一步思考。
关于python - 如何使用 ZeroMQ 通过 TCP 套接字发送 PNG 图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62234262/