Python MQTT улучшает скорость публикации для массива numpy изображений

В настоящее время у меня есть два сценария, один для захвата отснятого материала и публикации значений массива 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 - неподходящий протокол для вас. Он был разработан для низкой пропускной способности и ненадежных соединений, а не для видео в реальном времени.

Klaus D. 20.11.2018 04:55

@KlausD. не могли бы вы тогда дайте мне знать, как это лучше сделать?

Noor Sabbagh 20.11.2018 05:25

Также вам не следует использовать публичный тестовый брокер eclipse для такого рода вещей, если вы хотите попробовать это, вы должны использовать своего собственного локального брокера.

hardillb 20.11.2018 07:48

При отправке изображений вам следует рассмотреть возможность отправки их в формате YUV (который занимает половину полосы пропускания по сравнению с RGB) или в формате MJPEG / JPEG, что требует еще меньшей полосы пропускания. Вы также должны измерить время, чтобы просто получить изображения без передачи и просто передать изображения без получения. Затем, когда у вас будет точное время, возможно, рассмотрите возможность многопоточности.

Mark Setchell 20.11.2018 08:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
698
2

Ответы 2

Я думаю, что лучше всего было бы вместо этого транслировать с камеры, используя что-то вроде cvlc или gstreamer, а затем просто подключаться к нему из opencv (cap = cv2.VideoCapture ("http: // некоторый_url: некоторый_порт"), а затем вы должны получить разумную пропускную способность, всегда зависящую о пропускной способности, кодеке и т. д.

Используйте WebcamVideoStream из imutils, сожмите изображение в 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)

Другие вопросы по теме