преобразование байтового массива в мат

У меня есть драйвер CCD, который возвращает мне IntPtr. Я использовал Marshal.Copy для массива байтов (bytearray_Image), каждый элемент внутри bytearray_Image хранит 8-битное значение R/G/B, последовательность которого равна byte[0] = значение R, byte[1] = значение G, byte[2] = B стоимость... и так далее. Я успешно преобразовал в 3-канальный мат, используя приведенный ниже фрагмент кода:

var src = новый Mat (строки: nHeight, столбцы: nWidth, тип: MatType.CV_8UC3); var indexer = src.GetGenericIndexer();

        int x = 0;
        int y = 0;
        for (int z = 0; z < (bytearray_Image.Length - 3); z += 3)
        {
            byte blue = bytearray_Image[(z + 2)];
            byte green = bytearray_Image[(z + 1)];
            byte red = bytearray_Image[(z + 0)];

            Vec3b newValue = new Vec3b(blue, green, red);
            indexer[y, x] = newValue;
            x += 1;

            if (x == nWidth)
            {
                x = 0;
                y += 1;
            }
        }

Поскольку изображение очень большое, этот метод кажется слишком медленным для преобразования изображения. Есть ли способы сделать такое преобразование эффективно?


person JL2018    schedule 12.01.2021    source источник


Ответы (1)


Этот код работает для меня:

var image = new Mat(nHeight, nWidth, MatType.CV_8UC3);
int length = nHeight * nWidth * 3; // or image.Height * image.Step;
Marshal.Copy(bytearray_Image, 0, image.ImageData, length);

Но это будет работать для вас только в том случае, если длина шага данных byte[] равна длине мата

person user2250152    schedule 12.01.2021
comment
Спасибо за ваш ответ, относится ли image.ImageData к свойствам Mat.Data? Поскольку я не могу найти image.ImageData, я использую opencvsharp ver. 4,5 - person JL2018; 13.01.2021
comment
Я пробовал использовать image.Data вместо image.ImageData, это работает! Производительность значительно улучшилась, но использование памяти примерно в 2 раза по сравнению с методом GetGenericIndexer (7xxMB против 3xxMB). В любом случае, спасибо, пользователь 2250152 ответил - person JL2018; 13.01.2021