将字节数组转换为 Mat

converting byte array to Mat

我有一个 CCD 驱动程序,returns IntPtr 给我。我用Marshal.Copy转字节数组(bytearray_Image),bytearray_Image里面的每个元素存储8bit的R/G/B值,序列是byte[0] = R值,byte[1] = G 值,byte[2] = B 值...等等。我已使用以下代码片段成功转换为 3 通道垫:

var src = new Mat(行数:nHeight,列数:nWidth,类型:MatType。CV_8UC3); var 索引器 = 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;
            }
        }

由于图片很大,这种方法转换图片似乎太慢了。有什么方法可以有效地进行这种转换?

这段代码对我有用:

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[] 数据的步长等于 Mat 的

时,它才会对你有用