2016-10-30 3 views
1

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

Я был бы признателен за любую помощь, будь то ссылка или указав свою ошибку. Работали над этим в течение нескольких дней и не нашли ничего, что могло бы помочь мне в этом вопросе.

Заранее спасибо.

+1

Я не знаю, почему вы не отправлять изображения непосредственно в байтах - 'Fh = открытый (... "гь"),' SENDTO (fh.read ()) ' – furas

+0

Не могли бы вы объяснить это немного больше? Как работает функция sendto()? Я на самом деле совершенно новый для сокета и всего этого, поэтому ^^ –

+0

Nevermind, теперь я понимаю, что вы имеете в виду, но сообщение слишком длинное, поэтому оно не работает. Есть ли способ разделить данные на пакеты, чтобы отправить их таким образом? 'socket.error: [Errno 90] Сообщение слишком длинное' –

ответ

1

Вам не нужно OpenCV и N umPy для этого. Вместо этого просто отправьте байты файла напрямую. Если у вас есть Python 3.5, вы даже можете использовать socket.sendfile().

Более подробно см: Sending a file over TCP sockets in Python

+0

Спасибо, но я уже решил это так, как сказал мне фурас. –

0

Я не знаю, сколько знаков после запятой нужно, но вы могли бы кодировать Numpy массив значений в UTF16 BE, а затем декодировать после передачи сокета с

def retrieve_and_decode_data(): 
    try: 
     data,addr = s.recvfrom(4096)                                             
     list_of_converted_utf16chars = (repr(data.decode('utf-16')).split("\\")[1:]) 

    except (ValueError, IndexError) as e: 
     **perform some conversion-error exception...** 

«магнезии» функция дает представление utf16 обугливается вы можете посмотреть в UTF-таблице

вы можете преобразовать это представление в междунар или поплавок с

integer_value = int(list_of_converted_utf16chars[index], 16) 
+0

Спасибо, но я уже решил это так, как сказал мне фурас –

Смежные вопросы