Прежде всего, что я хочу сделать: Отправка фотографий с помощью Socket из моей малины Pi на мой ноутбук.Отправка массивов numpy через Socket
Клиент:
#!/usr/bin/python
import socket
import cv2
import numpy as np
import pickle
#Upload image
img = cv2.imread('/path/to/image', 0)
#Turn image into numpy-array
arr = np.asarray(img)
#Receiver ip
ip = "XXX.XXX.X.XXX"
#Set up socket and stuff
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#Loop through each array (5 for test)
for each in range(5):
#Encode each array
msg = pickle.dumps(arr[each][0])
#Send msg to ip with port
s.sendto(msg, (ip, 50000))
s.close()
Что здесь происходит: я загрузить фотографию, а затем превратить его в массив Numpy. Затем я беру каждую строку массива (каждый список) и «кодирую» его с помощью рассола, чтобы отправить его через Socket. Все отлично работает до этого момента.
Сервер:
#!/usr/bin/python
import socket
import numpy as np
import cPickle as pickle
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(("", 50000))
while True:
data, addr = s.recvfrom(4096)
conv = pickle.loads(data)
print conv
#print np.fromstring(conv,dtype=int)
s.close()
Сервер принимает кодированные данные и декодирует его обратно в массив Numpy (это то, что я хочу достичь).
В конце концов, он должен вернуть массив обратно в изображение, но я даже не добрался до этой части из-за проблем, которые у меня на данный момент.
Я также попытался сначала преобразовать массив в строку, закодировать его с помощью pickle, а затем отправить его, когда он будет декодирован, это массив numpy. Но это не сработало.
ValueError: строка размер должен быть кратным размеру элемента
Я был бы признателен за любую помощь, будь то ссылка или указав свою ошибку. Работали над этим в течение нескольких дней и не нашли ничего, что могло бы помочь мне в этом вопросе.
Заранее спасибо.
Я не знаю, почему вы не отправлять изображения непосредственно в байтах - 'Fh = открытый (... "гь"),' SENDTO (fh.read ()) ' – furas
Не могли бы вы объяснить это немного больше? Как работает функция sendto()? Я на самом деле совершенно новый для сокета и всего этого, поэтому ^^ –
Nevermind, теперь я понимаю, что вы имеете в виду, но сообщение слишком длинное, поэтому оно не работает. Есть ли способ разделить данные на пакеты, чтобы отправить их таким образом? 'socket.error: [Errno 90] Сообщение слишком длинное' –