将字节数组转换为 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 的
时,它才会对你有用
我有一个 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 的
时,它才会对你有用