通过 Socket 发送 numpy 数组
Sending numpy arrays via Socket
首先,我想做的事情:
正在使用 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 数组。然后我将数组的每一行(每个列表)和 "encode" 与 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: 字符串大小必须是元素大小的倍数
我将不胜感激任何形式的帮助,无论是 link 还是指出我的错误。
已经为此工作了好几天,但没有发现任何可以帮助我解决这个问题的东西。
提前致谢。
我不知道你需要多少小数位,但你可以用 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" 函数为您提供了 utf16 字符的表示形式,您可以在 utf-table
中查找
然后您可以使用
将此表示形式转换为 int 或 float
integer_value = int(list_of_converted_utf16chars[index], 16)
为此您不需要 OpenCV 和 NumPy。相反,只需直接发送文件的字节。如果你有 Python 3.5,你甚至可以使用 socket.sendfile()
.
有关详细信息,请参阅:Sending a file over TCP sockets in Python
首先,我想做的事情: 正在使用 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 数组。然后我将数组的每一行(每个列表)和 "encode" 与 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: 字符串大小必须是元素大小的倍数
我将不胜感激任何形式的帮助,无论是 link 还是指出我的错误。 已经为此工作了好几天,但没有发现任何可以帮助我解决这个问题的东西。
提前致谢。
我不知道你需要多少小数位,但你可以用 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" 函数为您提供了 utf16 字符的表示形式,您可以在 utf-table
中查找然后您可以使用
将此表示形式转换为 int 或 floatinteger_value = int(list_of_converted_utf16chars[index], 16)
为此您不需要 OpenCV 和 NumPy。相反,只需直接发送文件的字节。如果你有 Python 3.5,你甚至可以使用 socket.sendfile()
.
有关详细信息,请参阅:Sending a file over TCP sockets in Python