Преобразование байтового массива RGBA в изображение cv2 (без ошибок, cv2 зависает навсегда) - PullRequest
0 голосов
/ 25 января 2020

Я получаю от websocket массив [r, g, b, a ... r, g, b, a], представляющий изображение 300x300

img = np.asarray( bytearray(data), dtype=np.uint8 ).reshape( 300, 300, 4 )

Я конвертирую это изображение, используя numpy, и получаю массив массива [[r,g,b,a],[r,g,b,a],[r,g,b,a]]

I хочу конвертировать npArray в изображение cv2. Я стараюсь все, но ничего не получается. Код зависает без ошибок ...

img = cv2.imread(img, cv2.IMREAD_UNCHANGED)
cv2.imshow('frame', img)

Я не понимаю, что мне делать, и / или он зависает по любой другой причине ...

1 Ответ

1 голос
/ 25 января 2020

Короткий ответ: вам не нужно.

Когда вы используете cv2.imread(), он считывает и декодирует изображение в кодировке JPEG или PNG (или в формате TIFF или другое) с диска. Это делает декодирование сжатых изображений. Ваше изображение не сжато, поэтому вам это не нужно.

Внутренне OpenCV хранит изображения в виде Numpy массивов - у вас это уже есть, поэтому ваш массив уже является изображением. Счастливые дни! Вам не нужно ничего делать, этого достаточно:

img = np.asarray( bytearray(data), dtype=np.uint8 ).reshape( 300, 300, 4 )

Обратите внимание, что np.asarray() делится своими данными с bytearray, поэтому у вас могут возникнуть проблемы при изменении изображения. Если это так, вы можете сделать свою собственную изменяемую копию с помощью:

img = np.array(... as above ...)

Также обратите внимание, что cv2.imshow() впоследствии требуется waitKey() для обновления дисплея:

cv2.imshow("Window Title", image)
cv2.waitKey(-1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...