Массивы не равны после преобразования массива NumPy в массив байтов и обратно в массив NUMPY. - PullRequest
0 голосов
/ 08 ноября 2019

Я хочу отправить изображение, которое было импортировано opencv imread, на другой компьютер через сокет. Но полученные данные и отправленные данные не равны.

Я преобразовал данные массива numpy, которые я получил с помощью imread, и преобразовал их в байтовый массив для отправки через сокет. И затем я преобразовал массив байтов, который был получен на другом конце, обратно в массив NumPy. Но я не могу просмотреть изображение из полученных данных.

Это фрагмент кода в конце отправителя

im = cv2.imread('view.jpg')
stringimage = np.array_str(im)
byteimage = str.encode(stringimage)
sock.sendto(byteimage,("127.0.0.1",5002))

Это фрагмент кода в конце получателя

byteimage,addr = sock.recvfrom(1024)
decoded = bytes.decode(byteimage)
backstring = np.array(decoded)
cv2.imshow('RealSense', backstring)
cv2.waitKey(0)

Я получил эту ошибку

Ошибка типа: mat data type = 19 не поддерживается

для этой строки кода

cv2.imshow('RealSense', backstring)

Обновление

После получения предложений ниже и обращения к некоторым другим материалам я пришел к решению, которое работает для моего сценария.

Сторона отправителей изображения

#color_image is my opencv image

retval, data = cv2.imencode('.jpg', color_image, ENCODE_PARAMS)
b64_bytes = base64.b64encode(data)
b64_string = b64_bytes.decode()
sock.sendto(str.encode(b64_string), ("127.0.0.1", 5002))

Сторона получателя изображения

data, addr = sock.recvfrom(60000)
img = imread(io.BytesIO(base64.b64decode(data)))

Скажите, пожалуйста, есть ли плохое кодирование в моем решении

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

На этот же вопрос был дан полезный ответ здесь.

Проблема в том, что построение массива numpy из строки не анализирует данные как float / int так, как вы их написали(и преобразование в строку для отправки данных не требуется).

Вот упрощенный пример применения этого решения:

import numpy as np
from io import BytesIO

a = np.array([1, 2])
b = BytesIO()
np.save(b, a)

"""-----send the data-----"""
# send(b.getvalue())


data = BytesIO(b.getvalue())
c = np.load(data)
print(a)
print(c)

В результате:

[1 2]
[1 2]
1 голос
/ 08 ноября 2019

byteimage, addr = sock.recvfrom (1024)

Это ограничивает размер вашего буфера до 1024 байтов.

Читать Документы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...