массив uint8 с прямым порядком байтов в массив uint16 с прямым порядком байтов

В Python2.7 при массовой передаче USB я получаю кадр изображения с камеры:

frame = dev.read(0x81, 0x2B6B0, 1000)

Я знаю, что один кадр имеет размер 342x260 = 88920 пикселей с прямым порядком байтов, потому что я прочитал 2x88920 = 177840 (0x2B6B0) из массовой передачи.

Как я могу преобразовать содержимое массива фреймов с кодом типа = B в массив uint16 с прямым порядком байтов?


person Paul G.    schedule 25.06.2018    source источник


Ответы (1)


Что-то вроде этого должно помочь:

frame_short_swapped = array.array('H', ((j << 8) | i
                                        for (i,j)
                                        in zip(frame[::2], frame[1::2])))

Он объединяет два последовательных байта из frame и распаковывает эту пару в i и j. Сдвиньте j на один байт влево и or на i, эффективно поменяйте местами байты (также известное как преобразование порядка следования байтов для 2-байтового типа) и подайте это в массив типа H. Меня немного беспокоит этот бит, так как он должен соответствовать типу C short (согласно документам), но размеры типов действительно гарантируют только минимальную длину. Я думаю, вам нужно будет представить ctypes.c_uint16, если вы строги к этому?

person Ondrej K.    schedule 26.06.2018
comment
хорошо, похоже, это работает, небольшой тест с x = [3,103,3,103] преобразовал его в массив ('H', [26371, 26371]), что я и искал. Я скоро проверю это с данными моей камеры. Извините, мой английский плохой, но в вашем последнем предложении вы имеете в виду, что я должен использовать ctypes.c_uint16 для frame_short_swapped? Могу ли я также использовать массив numpy.uint16? - person Paul G.; 26.06.2018
comment
Я просто имел в виду, что если вам строго требуется uint16, typecode H (или short) этого не гарантирует. Если вы полагаетесь на это / это была проблема, вам придется сделать еще один шаг и использовать что-то еще для обработки и хранения ваших значений. Типа ctypes или, да, numpy. - person Ondrej K.; 26.06.2018
comment
Ой, извините, наверное, надо было добавить. Не гарантируется, что short имеет длину (всего) 2 байта, но на самом деле это очень вероятно, и есть вероятность, что в большинстве систем, с которыми вы сталкиваетесь, это так. :) Другими словами, в зависимости от вашего варианта использования имейте это в виду, но, возможно, никаких действий не требуется (по крайней мере, на данный момент). - person Ondrej K.; 26.06.2018