【问题标题】:Python MQTT improving publish speed for image numpy arrayPython MQTT 提高了图像 numpy 数组的发布速度
【发布时间】:2018-11-20 03:37:27
【问题描述】:

我目前有两个脚本,一个用于捕获素材并发布 numpy 数组值 (servant.py),另一个脚本 (master.py) 用于使用 opencv 处理这些值以用于以后的面部识别实现。问题是现在它非常慢,因为发送到主脚本的互联网包非常延迟。我想知道是否有更好的方法来做到这一点?当然现在每秒只发送一帧,所以我需要脚本能够处理每秒 24 帧。

这是两个脚本:

ma​​ster.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 发送。您还应该测量仅采集图像而不传输图像和仅传输图像而不采集图像的时间。然后,当你有准确的时间时,也许可以考虑多线程。

标签: python mqtt


【解决方案1】:

我认为你最好的选择是使用 cvlc 或 gstreamer 之类的东西从相机流式传输,然后简单地从 opencv 连接到它 (cap = cv2.VideoCapture("http://some_url:some_port") 然后你应该得到合理的吞吐量始终取决于带宽、编解码器等。

【讨论】:

    【解决方案2】:

    使用imutils中的WebcamVideoStream,将图片压缩成jpg,发布为base64:

    import base64
    import cv2
    from imutils.video import WebcamVideoStream
    
    cap = WebcamVideoStream(0)
    cap.stream.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    cap.stream.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
    cap.start()
    
    while True:
        frame = cap.read()
        if frame is None:
            print("Continue")
            continue
    
        retval, buffer = cv2.imencode('.jpg', frame)
        jpg_as_text = base64.b64encode(buffer).decode('utf-8')
        publish(jpg_as_text)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-11
      • 2018-10-10
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      相关资源
      最近更新 更多