【问题标题】:Displaying image from numpy Array sent via sockets显示来自通过套接字发送的 numpy 数组的图像
【发布时间】:2021-02-22 20:36:15
【问题描述】:

我正在尝试制作一个流媒体应用程序,它可以截取特定窗口的屏幕截图并将其发送到服务器,然后服务器显示 imgs。

捕获是通过 (WORKS)

完成的
frame = np.array(ImageGrab.grab(bbox=win32gui.GetWindowRect(window)))

帧发送:(WORKS

dp = pickle.dumps(frame)
to_send = bytes(f"{len(dp):<{HEADER}}", FORMAT) + bytes(FRAME_MSG, FORMAT) + dp
client.send(to_send)

接收:(作品

def receive_msg(msg_len, conn, buffer):
    msg = bytearray()
    while(len(msg) < msg_len):
        msg += conn.recv(buffer)
        # msg.append(conn.recv(buffer))
    return msg
msg = receive_msg(msg_len, conn, 1024)
arr = pickle.loads(msg)

显示:(不工作

cv2.imshow('window',cv2.cvtColor(arr, cv2.COLOR_BGR2RGB))

我尝试显示的选项:

-------
image = cv2.imdecode(arr, cv2.COLOR_BGR2RGB)
cv2.imshow('URL2Image',image)
-------
cv2.imshow('window', arr)
-------
img = Image.fromarray(arr, "RGB")
img.show()
-------

我标记为工作的部分已通过发送示例 numpy 数组数据进行了测试。

---编辑---

原来cv2.imshow() 需要在下面的某个地方调用cv2.waitKey() 才能正常工作。 感谢所有试图提供帮助的人。

【问题讨论】:

  • 请尝试制作一个“最小完整的可重现示例” stackoverflow.com/help/minimal-reproducible-example 目前可能有太多我们看不到的东西可能会导致问题。您应该拥有所有 import 语句和 actualminimalrunnable 代码。谢谢。

标签: python arrays numpy sockets cv2


【解决方案1】:

您的阵列形状是什么? 确保您不仅将其转换为 1d 数组,还可以将其转换为 2d 或 3d 数组(取决于它是灰度还是彩色)。

您必须以某种方式指定预期数组的 x 和 y(可能还有 z)维度 - 在消息中或在接收端硬编码到代码中。

当然,将这些作为参数发送到消息中会更好,但为了调试,我建议先对尺寸进行硬编码,以将其转换为正确的 2d/3d 形状。如果它有效,那么这就是问题所在。然后弄清楚如何将其作为消息与图像本身一起发送。

【讨论】:

  • print(arr.shape) 的输出是:(628, 882, 3) 所以形状不是问题。我也没有从 cv2.imshow 函数中得到任何错误。只是弹出的窗口是 inresposine 并且必须关闭(同时数据正在流动)。
  • 如果数据同时流动,这意味着可能会在许多图像实例上调用 show(),这可能会导致挂起?您是否尝试在调用 show() 之前将图像保存到文件?如果图像成功保存到文件并且看起来不错,那就是朝那个方向看的提示。甚至可能在代码的那个点放置大约 10 秒的等待语句。
猜你喜欢
  • 1970-01-01
  • 2014-12-10
  • 2019-08-15
  • 2013-12-31
  • 2015-12-08
  • 2011-04-11
  • 1970-01-01
相关资源
最近更新 更多