В настоящее время у меня есть два сценария, один для захвата отснятого материала и публикации значений массива 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)
@KlausD. не могли бы вы тогда дайте мне знать, как это лучше сделать?
Также вам не следует использовать публичный тестовый брокер eclipse для такого рода вещей, если вы хотите попробовать это, вы должны использовать своего собственного локального брокера.
При отправке изображений вам следует рассмотреть возможность отправки их в формате YUV (который занимает половину полосы пропускания по сравнению с RGB) или в формате MJPEG / JPEG, что требует еще меньшей полосы пропускания. Вы также должны измерить время, чтобы просто получить изображения без передачи и просто передать изображения без получения. Затем, когда у вас будет точное время, возможно, рассмотрите возможность многопоточности.






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