【问题标题】:How can I send PNG image over TCP sockets using ZeroMQ?如何使用 ZeroMQ 通过 TCP 套接字发送 PNG 图像?
【发布时间】:2020-09-25 18:39:04
【问题描述】:

我有一个使用 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 发送帧的好方法吗?或者还有其他方法吗?我该如何处理我的问题?上面的代码有什么问题?

【问题讨论】:

  • 您的问题提到了 "frames""byte arrays""strings",但您的代码似乎从磁盘读取/写入PNG图像。您能否更明确地说明您从发送端开始的确切内容(可能包括前几个字节的数据)以及您希望在接收端结束的确切内容。我猜也不是像你的代码这样的磁盘文件。谢谢。
  • 最后,我想将我的游戏 (Unity) 中的帧发送到 Python,并使用我的 Keras 模型分析这些帧。然后,我会将结果(命令)发送到 Unity,但这部分更容易。
  • 我仍然不清楚您的 "frame" 是什么 Python 数据结构。是清单吗?还是字符串?还是一个 Numpy 数组?请问你能给出一两行代码来制作一个 128 像素宽 x 64 像素高的红框吗?或者任何有形的东西。谢谢。
  • "frame" 将是一个字节数组,因为任何可以转换为字节的东西都可以通过 ZeroMQ 传输。然后在python中,我需要将字节数组解码成图像。
  • 说它是一个字节数组就像说它是信息,或者它是一些字节。什么是字节?他们的意思是什么?前 4 个字节 \x89PNG 是否意味着它是 PNG 图像?还是他们\xff\xd8 表示它是JPEG?还是他们\xff\x00\x00 表示这是一个红色像素?

标签: python sockets keras zeromq distributed-computing


【解决方案1】:

“这是从 Unity 向 Python 发送帧的好方法吗?”

我敢说。

但是,我不知道如何在 Python 上读取发送的图像(字节数组)。

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


“或者还有其他方法吗?”

哦,当然有。


“我该如何处理我的问题?”

最好学习可以安全使用的此类工具,用于编码和解码阶段。大量可用的 Python 标准模块 - numpypil/pillowcv 用于图像转换,@987654327 @pickle 用于 SER/DES,甚至是 struct

多年来一直使用这些 with ZeroMQ, you may be sure 使用安全工具朝着正确的方向前进。


Q“上面的代码有什么问题?”

这永远不会飞。

“发件人”
被提议为 REP-实例永远不能以调用 .send()-方法。
从不。

“接收者”
被提议为 REQ-实例永远不能从调用 .recv()-方法。
从不。

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

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

不要误会我的意思,我从一开始就喜欢 ZeroMQ,并钦佩 Pieter HINTJENS 和 Martin SUSTRIK 的大量发明和性能改进,他们已经融入了 ZeroMQ 的“零之禅”,但我尝试提醒您这需要一些时间从头到尾掌握禅。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2013-12-31
    • 1970-01-01
    相关资源
    最近更新 更多