如何使用 Electron 进行后端 Python 的图像处理应用程序?

Oğu*_*lik 4 python opencv image-processing node.js electron

我正在开发一个关于图像处理的应用程序。我在 Python 上使用 OpenCV,并尝试使用 PyQT 实现 GUI,但使用 HTML、CSS 和 Javascript 对于我的项目来说是更好的选择。

我知道 Electron 提供带有使用 HTML、CSS 和 Javascript 实现的 GUI 的桌面应用程序,但是,我不确定如何将 Python 连接到 Node 和 Electron。

我需要将使用 NumPy 和 OpenCV 操作生成的图像数组传递到前端以在我的 GUI 中显示,并且这需要实时发生。我将在 OpenCV 中读取帧并进行一些处理,然后以每秒 24 帧的速度在 GUI 上显示它们,因此性能很重要。

如何实现将图像数组数据从 Python 实时发送到 Electron 的任务?

fra*_*567 5

传统上,我们使用套接字进行进程间通信(IPC)。Electron 本身使用套接字在 NodeJS 进程和 UI 窗口之间进行通信。套接字的速度非常快,因此您不必担心数据传输本身的性能。

Python 有一个用于套接字的内置,而对于 NodeJS,则有node-ipc 库(这是 Electron 用于其内部套接字的库)。

然后您必须定义您的数据协议。例如,您可以通过套接字发送/接收 JSON 对象,这在 Python 和 NodeJS 中编码/解码都非常简单。但如果性能很重要,您可以做更高级的事情。

您还必须考虑如何管理流程本身。事实上,您必须确保 Electron 应用程序在启动时会生成 Python 进程。并确保它在退出时杀死它(例如,通过套接字发送消息!)。

我的回答很抽象,但我希望它能给你一些入门的见解。这不是一个微不足道的任务;)


Oğu*_*lik 5

我创建了一个超级简单的存储库,其中包含工作示例,以展示使用 Redis 和 ZeroMQ 在 Python 和 Nodejs 之间进行通信的两种不同方法。一探究竟:

https://github.com/OgulcanCelik/nodejs-python-communication

原评论:

所以我想通了。我所做的是使用 python-shell NPM 包从 NodeJS 调用 Python 脚本,并通过 stdin 在 Python 和 NodeJS 之间进行通信。Python脚本在使用OpenCV进行一些处理后生成图像,将其编码为png,将其转换为字节,将其编码为base64,最后将其解码为ascii以便在Node部分读取。

Python部分是这样的:

import cv2 as cv2
import base64

source = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
success, encoded_image = cv2.imencode('.png', source)
content = encoded_image.tobytes()
print(base64.b64encode(content).decode('ascii'))
Run Code Online (Sandbox Code Playgroud)

NodeJS部分:

pyshell.on("message", function(message) {
  console.log(message)
});

setInterval(() => {
  pyshell.send(data);
}, 300);
Run Code Online (Sandbox Code Playgroud)

更多信息请参见: 无法读取从 Python 发送的 Node.js 中的 Base64 编码图像