通过Socket发送numpy数组

时间:2016-10-30 16:45:46

标签: python arrays sockets numpy pickle

首先,我想做什么: 使用Socket从我的Raspberry Pi发送照片到我的笔记本电脑。

客户端:

#!/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阵列。然后我拿出数组的每一行(每个列表)并用pickle“编码”它然后通过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:字符串大小必须是元素大小的倍数

我会感谢任何帮助,无论是链接还是指出我的错误。 几天来一直在研究这个问题,并没有找到任何可以帮助我解决这个问题的事情。

提前致谢。

2 个答案:

答案 0 :(得分:1)

你不需要OpenCV和NumPy。相反,只需直接发送文件的字节。如果你有Python 3.5,你甚至可以使用socket.sendfile()

有关详细信息,请参阅:Sending a file over TCP sockets in Python

答案 1 :(得分:0)

我不知道你需要多少小数位,但你可以用UTF16 BE编码你的numpy数组值,然后用套接字发送后解码

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...**

“repr”函数为您提供了可以在utf-table中查找的utf16字符的表示

然后您可以使用

将此表示转换为int或float
integer_value = int(list_of_converted_utf16chars[index], 16)