python通过套接字

时间:2016-10-17 03:15:26

标签: python sockets opencv raspberry-pi

我试图通过套接字发送图像 - 我使用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())

一切正常。关于什么可能在中途切断我发送的文件的想法?

1 个答案:

答案 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))

在客户端。

否则,您必须在邮件中包含形状信息,以便在客户端进行解码。