Как обрабатывать 10-битные байеровские данные (байтовый массив) - PullRequest
0 голосов
/ 04 февраля 2019

Я застрял в течение нескольких часов, надеюсь, вы мне поможете.

Я работаю над интеграцией камеры в приложение и хотел бы использовать RAW-данные, которые можно извлечь.присваивая значение ' bayer-mipi-10grbg ' параметру ' picture-format '.С моим Redmi Note 6 в обратном вызове OnPictureTaken я получаю байтовый массив (15 482 880 байт).

Мне еще не удалось использовать этот байтовый массив.

Я прочитал, что это было необходимодля удаления данных с целью получения пригодного изображения RGB.Поэтому я выбрал OpenCv, чтобы сделать мою жизнь проще, см. Следующий фрагмент кода:

public void OnPictureTaken(byte[] data, Camera camera)
{
    var height  = 4032;
    var width   = 3024;
    var mBayer  = new Mat(width, height, CvType.Cv16u);
    var mRgb    = new Mat();

    mBayer.Put(0, 0, /* data' */);

    Imgproc.CvtColor(mBayer, mRgb, Imgproc.COLORBayerGR2BGR);

    Imgcodecs.Imwrite($"{_galleryFolder}/{DateTime.Now.ToString("yyMMddhhmmss")}", mRgb);
}

Моя проблема в том, что для построения матрицы Cv16u я не могу дать ей массив байтов, если яправильно понимать, что нужен массив шорт.

Мой вопрос: какое преобразование я должен применить к моему байтовому массиву, чтобы получить действительный массив шорт?

Редактировать: Шортымассив, очевидно, не будет простой копией массива байтов, например, я представляю, что первые x байтов соответствуют первому значению массива шорт (это пример).Об этом преобразовании я не знаю.

Edit2: 4032x3024 - это размер, который я получаю из параметра raw-size.У меня явно возникают трудности с установлением связи между этим размером и размером получаемого массива байтов.Я загрузил файл, который содержит полученный массив байтов (сохранен как есть, без обработки): https://ufile.io/gsis9

1 Ответ

0 голосов
/ 05 февраля 2019

Хорошо, благодаря ценной помощи Дэна мне удалось создать изображение из моих необработанных данных.Часть кода:

var size    = width * height * 1.25f; // 10-bit depth
var pData   = new List<short>();

for (int i = 0; i < size; i += 5)
{
    pData.Add((short)(data[i] << 2 | ((data[i + 4] >> 0) & 3)));
    pData.Add((short)(data[i + 1] << 2 | ((data[i + 4] >> 2) & 3)));
    pData.Add((short)(data[i + 2] << 2 | ((data[i + 4] >> 4) & 3)));
    pData.Add((short)(data[i + 3] << 2 | ((data[i + 4] >> 6) & 3)));
}

var mBayer = new Mat(width, height, CvType.Cv16u);
mBayer.Put(0, 0, pData.ToArray());

var mRgb = new Mat(width, height, CvType.Cv8u);
Imgproc.CvtColor(mBayer, mRgb, Imgproc.COLORBayerGR2RGB);

Это дает мне очень зеленоватый образ (моя следующая задача - управлять этим зеленым ореолом).

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