我一直在尝试使用套接字发送图像,但是我遇到了很大的编码问题。我正在使用python-2.7和python-3上的客户端运行服务器。
我认为问题出在此功能上
def decode_image(image):
imageArray = str(bytearray(image))
nparr = np.fromstring(imageArray, np.uint8)
nparr.shape = (320, 240, 3)
nparr = cv2.cvtColor(nparr, cv2.COLOR_BGR2RGB)
print(nparr)
return nparr
如果我使用python2.7解释器运行代码,则一切正常,但是,使用python3解释器则无法正常工作。我收到的错误如下:
nparr.shape = (320, 240, 3)
ValueError: cannot reshape array of size 597048 into shape (320,240,3)
这意味着代替320 * 240 * 3(230400)个已解码元素,而是597048。用python3解码字节数组以获得与python2.7相同的结果的等效方法是什么?
image
是一个bytes
值。
答案 0 :(得分:1)
您应decode
bytearray
;
imageArray = bytearray(image).decode()
这是一个示例(从the docs修改):
>>> np.fromstring(b'1 2'.decode(), dtype=int, sep=' ')
array([1, 2])
另一方面:str(b'1 2') == "b'1 2'"
。
答案 1 :(得分:1)
您不需要解码数据,也不需要在这里使用bytearray()
。 Numpy可以直接使用numpy.frombuffer()
接受一个bytes
值。
您看到的错误是由于str()
调用引起的:
str(bytearray(image))
返回bytearray()
对象的 Python表示形式:
>>> bytearray(5)
bytearray(b'\x00\x00\x00\x00\x00')
>>> str(bytearray(5))
"bytearray(b'\\x00\\x00\\x00\\x00\\x00')"
str()
返回了一个字符串,该字符串具有与第一个表达式所回显的数据相同的数据。您正在将bytearray(b'
前缀,文字\x
字符和数字传递给numpy。那是围绕您的数据的14个字节的额外数据,并且数据本身已经膨胀了很大一部分,因为所有不可打印的字符都被分割为ASCII十六进制数字加上反斜杠和x
字符。这就是为什么您的数据无法整形的原因,您的二进制数据为长230400字节,但已被“整形”为恰好使用597048个字符的字符串表示形式,因此每个输入字节大约2.6个字母
如果image
是一个bytes
值或一个实现Python缓冲区接口的对象,只需将此值直接传递给numpy.frombuffer()
:
nparr = np.frombuffer(image, np.uint8)
如果image
可以是整数(0-255)或整数可迭代,则只需根据该值创建一个bytes()
对象。因此,无论哪种类型的image
,以下行都将正确运行:
nparr = np.frombuffer(bytes(image), np.uint8)
bytearray()
可能接受并仍然可以使用其他类型,但是在您的特定代码示例中将不起作用。