Numpy чтение 12-битных байтов из буфера - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть камера, выводящая формат BayerRG12Packed, что означает, что каждое значение составляет 12 бит, а они не дополняются до 16 бит.

Я пытаюсь найти простое решение этой проблемы (почти как если бы я мог использовать uint12 dtype), я пробовал приведенный ниже код, но, похоже, он не выдает правильный вывод.

Я затрудняюсь понять этот процесс ..

Для получения дополнительной информации о Тип данных здесь ссылка на do c относительно этого (это просто другой порядок пикселей, чем у фильтра RG): Формат BayerGB12Packed

Данные, поступающие из буфера, не подписаны.

def read_uint12(data_chunk):
    data = np.frombuffer(data_chunk, dtype=np.uint8)
    fst_uint8, mid_uint8, lst_uint8 = np.reshape(data, (data.shape[0] // 3, 3)).astype(np.uint16).T
    fst_uint12 = (fst_uint8 << 4) + (mid_uint8 >> 4)
    snd_uint12 = ((mid_uint8 % 16) << 8) + lst_uint8
    return np.reshape(np.concatenate((fst_uint12[:, None], snd_uint12[:, None]), axis=1), 2 * fst_uint12.shape[0])

1 Ответ

1 голос
/ 17 апреля 2020

Я действительно нашел решение в этой теме:

{ ссылка }

"Найден ответ @cyrilgaudefroy полезный. Однако изначально он не работал на моем Упакованные 12-битные данные бинарных изображений. Обнаружено, что в этом конкретном случае упаковка немного отличается. «Средний» байт содержал наименее значимые отрывки. Байты 1 и 3 триплета являются наиболее значимыми 8 битами из двенадцати. Отсюда модифицированный @cyrilgaudefroy ответ на: "

def read_uint12(data_chunk):
    data = np.frombuffer(data_chunk, dtype=np.uint8)
    fst_uint8, mid_uint8, lst_uint8 = np.reshape(data, (data.shape[0] // 3, 3)).astype(np.uint16).T
    fst_uint12 = (fst_uint8 << 4) + (mid_uint8 >> 4)
    snd_uint12 = (lst_uint8 << 4) + (np.bitwise_and(15, mid_uint8))
    return np.reshape(np.concatenate((fst_uint12[:, None], snd_uint12[:, None]), axis=1), 2 * fst_uint12.shape[0])
...