【发布时间】:2020-10-18 17:05:38
【问题描述】:
我有一个多线程 python 脚本,可以将图像转换为 NumPy 数组(占用网格)。然后,python 脚本会不断更改数组的值以模拟地图中的点移动。使用 Pillow 将该数组转换回图像,然后编码为 base64。 NodeJS 部分有一个快速服务器正在运行,它也有一个与移动应用程序的 SocketIO 连接。
我想做的是: 将编码图像从服务器发送到移动应用程序,因此想到的选项是从 nodeJs 运行 python 脚本,并且当 python 脚本传输编码图像时,服务器会将其重定向到移动应用程序。
我正在寻找的是:
- 将python脚本输出流式传输到nodeJS而不停止(直到模拟停止)
- 或使用更好的解决方案将数据从 python 获取到手机
提前致谢!
要运行的python脚本:
import matplotlib.pyplot as plt
import cv2
import threading
import base64
from PIL import Image
temp = 0
global im_bw
pixel = 0
def update_image():
global im_bw
im2 = Image.fromarray(im_bw)
image64 = base64.b64encode(im2.tobytes())
# print the base64 encoded image to javascript
print(image64)
threading.Timer(1, update_image).start()
print("initialization")
im_gray = cv2.imread(r'gridMapBlue.JPG', cv2.IMREAD_GRAYSCALE)
(thresh, im_bw) = cv2.threshold(im_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
thresh = 127
im_bw = cv2.threshold(im_gray, thresh, 255, cv2.THRESH_BINARY)[1]
# noinspection PyBroadException
try:
update_image()
except Exception as e:
print(e.with_traceback())
pass
# simulate the dot moving by modifying the
while True:
if pixel == 200:
break
temp = im_bw[150,pixel]
im_bw[150, pixel] = 127
pixel += 1
Javascript 代码:
const express = require("express");
const app = express();
const io = require("./api/services/SocketIoService")
const spawn = require('child_process').spawn;
const socketIO = new io(app);
socketIO.server.listen(6969, () => console.log("server started"))
py = spawn('python',["E:\\QU\\Senior\\robot_positioning\\robot_position_map.py"])
py.stdout.on('data', (data)=>console.log(data));
py.stderr.on("error", err =>console.log(err))
编辑:添加了创建占用网格的代码和我尝试过的javascript代码(但没有用)
【问题讨论】:
-
棘手,您可以/应该从节点生成 python 进程,然后您可以使用
child_processstdio 流。但我不确定客户端是否检测到图像已更改并重新渲染它 -
我试图生成 python 进程,但是我遇到了几个问题,python 脚本在 PyCharm 上运行良好,但是从服务器运行它时,python 脚本会抛出错误
-
你能为我添加一个简约的设置吗?听起来很有趣,我想尝试让它发挥作用
-
@Marc 我现在就添加它
-
@naif-mazan 您能否添加一个完整简约设置,包括。设置脚本/依赖项
标签: python node.js python-3.x socket.io