Преобразовать строку обратно в массив NumPy - PullRequest
0 голосов
/ 02 января 2019

Я работаю над видео-чатом на python. Я использую CV2 для захвата текущего изображения (это дает мне массив данных), а затем отправляю этот сервер на мой сервер. Теперь у меня есть строка на сервере, и мне нужно декодировать ее обратно в массив NumPy.

Я использую Python 3.7, и пока не думаю, что-нибудь.

    #client 
    #capture 500 frames
    while i < 500:
        i = i + 1
        # Capture frame-by-frame
        ret, frame = cap.read()
        #send data                           
        client_socket.send(bytes(str(ret) + "###" + str(frame), "utf-8"))


    #server
    #split ret and frame
    ret, frame = str(conn.recv(16000)).split("###")
    gray = cv2.cvtColor(frame.toNumpyArray #PseudoMethod  <-- Here
    ,cv2.COLOR_BGR2GRAY)

Мне нужен только метод для преобразования строки обратно в массив NumPy. Если я распечатываю, строка выглядит так:

b '[[[128 255 255] \ n [125 255 255] \ n [107 255 255] \ n ... \ n [102 130 167] \ n [102 128 172] \ n [102 128 172]] \ n \ n [[128 255 255] \ n [127 255 255] \ n [108 255 255] \ n ... \ n [102 130 167] \ n [102 128 172] \ n [102 128 172]] \ n \ n [[111 255 255] \ n [111 255 255] \ n [109 255 255] \ n ... \ n [99 131 169] \ n [99 131 169] \ n [ 99 131 169]] \ n \ n ... \ n \ n [[27 64 95] \ n [29 67 97] \ n [24 66 98] \ n ... \ n [73 117 160] \ n [70 119 161] \ n [70 119 161]] \ n \ n [[18 71 81] \ n [20 74 83] \ n [30 67 93] \ n ... \ n [77 117 159] \ n [74 118 163] \ n [74 118 163]] \ n \ n [[14 68 77] \ n [19 73 82] \ n [30 67 93] \ n ... \ n [77 117 159] \ n [74 118 163] \ n [74 118 163]]] '

Извините за мой плохой английский, я учусь на немецком.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Следующая пара программ демонстрирует один из способов передачи связанного объекта ndarray через сетевой сокет.Клиент преобразует массив в поток байтов с помощью метода save, записывая поток в объект BytesIO, который затем отправляется через сокет на сервер:

import numpy as np
import socket
from io import BytesIO

# Create an output socket connected to server
sout = socket.create_connection(('127.0.0.1', 6543))

# Create data and write binary stream out to socket

a = np.array([[1.1, 2.2, 3.3],
              [4.4, 5.5, 6.6],
              [7.7, 8.8, 9.9]])

b = BytesIO()
np.save(b, a)

sout.send(b.getvalue())
sout.close()

Сервер прослушивает в соответствующей сетиадрес, получая данные до закрытия конечного сокета.Затем он преобразует полученные данные в объект BytesIO, из которого функция numpy load восстанавливает структуру:

import numpy as np
import socket
from io import BytesIO

# Create socket listening on correct port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 6543))
s.listen()

# Accept a connection and receive data
sock, address = s.accept()
data = b''
while True:
    indt = sock.recv(1024)
    if not indt:
        break
    data += indt

# Take data and recast to np.ndarray
data = BytesIO(data)

b = np.load(data)
print(type(b), b, sep='\n')

Результат работы сервера следующий:

<class 'numpy.ndarray'>
[[1.1 2.2 3.3]
 [4.4 5.5 6.6]
 [7.7 8.8 9.9]]

Существуют различные способы оптимизации этого кода, но этого должно быть достаточно для начала работы.

0 голосов
/ 02 января 2019

Я думаю, что функция numpy.fromstring делает именно то, что вы хотите.

Например, вызов np.fromstring('1 2', dtype=int, sep=' ') возвращает этот массив: array([1, 2]).

Надеюсь, это поможет.

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