У меня есть драйвер 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;
}
}
Поскольку изображение очень большое, этот метод кажется слишком медленным для преобразования изображения. Есть ли способы сделать такое преобразование эффективно?