【发布时间】:2018-11-20 03:37:27
【问题描述】:
我目前有两个脚本,一个用于捕获素材并发布 numpy 数组值 (servant.py),另一个脚本 (master.py) 用于使用 opencv 处理这些值以用于以后的面部识别实现。问题是现在它非常慢,因为发送到主脚本的互联网包非常延迟。我想知道是否有更好的方法来做到这一点?当然现在每秒只发送一帧,所以我需要脚本能够处理每秒 24 帧。
这是两个脚本:
master.py
import paho.mqtt.client as mqtt
import numpy as np
import json
import PIL
MQTT_SERVER = "iot.eclipse.org"
MQTT_PATH = "test_channel"
def on_connect(client, userdata, flags, rc):
print("connected with result code " + str(rc))
client.subscribe(MQTT_PATH)
def on_message(client, userdata, msg):
dtype = "uint8"
dshape = (480, 640, 3)
data = msg.payload
img_array = np.fromstring(data, dtype=dtype).reshape(dshape)
img = PIL.Image.fromarray(img_array)
img.save("img.png")
img.show()
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(MQTT_SERVER, 1883, 60)
client.loop_forever()
servant.py
import paho.mqtt.client as mqtt
import time
import cv2
import numpy
import json
MQTT_SERVER = "iot.eclipse.org"
MQTT_PATH = "test_channel"
mqttc = mqtt.Client()
mqttc.connect(MQTT_SERVER, 1883, 60)
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
MQTT_MESSAGE = frame.tostring()
mqttc.publish(MQTT_PATH, MQTT_MESSAGE)
mqttc.loop()
time.sleep(1)
【问题讨论】:
-
如果您想流式传输视频,MQTT 不是适合您的协议。它是为低带宽和不可靠的连接而设计的,不适用于实时视频。
-
@KlausD。那你能告诉我一个更好的方法吗?
-
另外,你不应该使用 eclipse 公共测试代理来做这种事情,如果你想试试这个,你应该使用自己的本地代理
-
当您发送图像时,您应该考虑将它们作为 YUV(相对于 RGB 占用一半带宽)或作为需要更少带宽的 MJPEG/JPEG 发送。您还应该测量仅采集图像而不传输图像和仅传输图像而不采集图像的时间。然后,当你有准确的时间时,也许可以考虑多线程。