【发布时间】:2017-07-11 17:27:52
【问题描述】:
我的目标是将图像和数据字符串从 RPi(服务器)发送到客户端。我使用send_json(data),其中数据是字典{'img': img_ls, 'telemetry':'0.01, 320, -10'}。 img_ls 是转换为列表的图像。问题是我得到len( img_ls ) = 57556,而原始图像的大小为:320 x 240 = 76800。我不明白为什么会出现差异。代码如下:
服务器端
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://0.0.0.0:5557")
def outputs():
stream = io.BytesIO()
while True:
yield stream
stream.seek(0)
sensors = '0.01, 320, -10'
img_ls = np.fromstring(stream.getvalue(), dtype=np.uint8).tolist()
data = {'telemetry': sensors, 'img': img_ls}
socket.send_json(data)
stream.seek(0)
stream.truncate()
with picamera.PiCamera() as camera:
camera.resolution = (320, 240)
camera.framerate = 80
time.sleep(2)
camera.capture_sequence(outputs(), 'jpeg', use_video_port=True)
客户端
ip_server = "192.168.42.1"
context = zmq.Context()
zmq_socket = context.socket(zmq.SUB)
zmq_socket.setsockopt(zmq.SUBSCRIBE, b'')
zmq_socket.setsockopt(zmq.CONFLATE, 1)
zmq_socket.connect("tcp://{}:5557".format(ip_server))
try:
img_nbr = 1
while True:
start = time.time()
frames = zmq_socket.recv_json()
img_ls = frames['img']
telemetry = frames['telemetry']
#convert img list to array
img_arr = np.asarray(img_ls)
#reshape gives error because 320*240 != len(img_ls)
image = np.reshape(img_ls, (320, 240))
#save image file locally
image = Image.fromarray(image)
#timestamp in ms
timestamp = int(time.time() * 1000 )
image.save('img_'+str(timestamp)+'.jpg')
print('Frame number: ', str(img_nbr))
img_nbr += 1
finally:
pass
最后说明:这是我尝试将图像和传感器数据从 RPi 同步流式传输到客户端。我担心数组和列表转换(在 RPi 端完成)可能会减慢流式传输速度。如果有更好的方法(仍然)使用zmq,请告诉我。
【问题讨论】: