首先,我想做什么:从我的Raspberry Pi发送带有Socket的照片到我的笔记本电脑 .
Client:
#!/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发送它 . 到目前为止一切正常 .
Server:
#!/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 回答
我不知道你需要多少小数位,但你可以用UTF16 BE编码你的numpy数组值然后在socket发送后解码
“repr”函数为您提供了可以在utf-table中查找的utf16字符的表示
然后,您可以将此表示转换为int或float with
你不需要OpenCV和NumPy . 相反,只需直接发送文件的字节 . 如果你有Python 3.5,你甚至可以使用
socket.sendfile()
.有关更多详细信息,请参阅:Sending a file over TCP sockets in Python