我试图通过套接字发送图像 - 我使用pycam在我的树莓派上捕获图像,发送到远程计算机进行处理,然后发回响应。
在服务器(pi)上,我捕获图像,转换为数组,重新排列为1D数组并使用tostring()方法。
在服务器上,收到的字符串长度不同。对这里出了什么问题的想法?附件是我正在运行的代码,以及服务器和客户端上的输出
服务器代码:
from picamera.array import PiRGBArray
from picamera import PiCamera
import socket
import numpy as np
from time import sleep
import sys
camera = PiCamera()
camera.resolution = (640,480)
rawCapture = PiRGBArray(camera)
s = socket.socket()
host = 'myHost'
port = 12345
s.bind((host,port))
s.listen(1)
while True:
c,addr = s.accept()
signal = c.recv(1024)
print 'received signal: ' + signal
if signal == '1':
camera.start_preview()
sleep(2)
camera.capture(rawCapture, format = 'bgr')
image = rawCapture.array
print np.shape(image)
out = np.reshape(image,640*480*3)
print out.dtype
print 'sending file length: ' + str(len(out))
c.send(str(len(out)))
print 'sending file'
c.send(out.tostring())
print 'sent'
c.close()
break
客户代码:
import socket, pickle
import cv2
import numpy as np
host = '192.168.1.87'
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.send('1')
#while true:
x = long(s.recv(1024))
rawPic = s.recv(x)
print 'Received'
print x
print len(rawPic)
type(rawPic)
#EDITED TO INCLUDE DTYPE
image = np.fromstring(rawPic,np.uint8)
s.close()
服务器输出:
received signal: 1
(480, 640, 3)
uint8
sending file length: 921600
sending file
客户输出:
Received
921600
27740
str
ValueError Traceback (most recent call last)
<ipython-input-15-9c39eaa92454> in <module>()
----> 1 image = np.fromstring(rawPic)
ValueError: string size must be a multiple of element size
我想知道问题是我是否在uint8上调用tostring(),并且如果fromstring()假设它是uint32?我无法弄清楚为什么收到的字符串比发送的字符串小得多。
修改 似乎由于某种原因服务器没有完全发送文件。它从不打印&#39;发送&#39;它应该在完成时完成。如果我将发送行更改为:
c.send(str(len(out[0:100])))
print 'sending file'
c.send(out[0:100].tostring())
一切正常。关于什么可能在中途切断我发送的文件的想法?
答案 0 :(得分:1)
当您致电tostring()
时,数据类型(和形状)信息将丢失。您必须使用您期望的数据类型提供numpy。
例如:
import numpy as np
image = np.random.random((50, 50)).astype(np.uint8)
image_str = image.tostring()
# Works
image_decoded = np.fromstring(image_str, np.uint8)
# Error (dtype defaults to float)
image_decoded = np.fromstring(image_str)
如果形状总是固定的,你可以
image_with_proper_shape = np.reshape(image_decoded, (480, 640, 3))
在客户端。
否则,您必须在邮件中包含形状信息,以便在客户端进行解码。