如何有效地从 EmguCV (OpenCV) 图像中获取流
How to efficiently get stream from EmguCV (OpenCV) image
我有一个 EmguCV.Image<Brg, Byte>()
实例和另一个第 3 方 API,它需要 Stream
表示图像数据。
我能够将 EmguCV 图像转换为流并使用 System.Drawing.Bitmap.Save
将其传递给第三方 API,但这不是很有效。
如何尽可能高效地获取流?
此代码有效:
var image = new Image<Rgb, byte>("photo.jpg");
var bitmap = image.Bitmap// System.Drawing - this takes 108ms!
using (var ms = new MemoryStream())
{
bitmap.Save(ms, ImageFormat.Bmp); //not very efficient neither
ms.Position = 0;
return ImageUtils.load(ms); //the 3rd party API
}
我尝试直接从图像创建 UnmanagedMemoryStream
:
byte* pointer = (byte*)image.Ptr.ToPointer();
int length = image.Height*image.Width*3;
var unmanagedMemoryStream = new UnmanagedMemoryStream(pointer, length);
但是当我尝试读取它时,它会抛出一个 AccessViolationException
:试图读取或写入受保护的内存。
for (int i = 0; i < length; i++)
{
//throw AccessViolationException at random interation, e.g i==82240, 79936, etc
unmanagedMemoryStream.ReadByte();
}
本例中的长度为 90419328,应该是正确的,因为它与 image.ManagedArray.Length;
具有相同的值
如何在不复制数据的情况下获取流?
好的,在 Image() 上有 byte[] 类型的字节 属性 所以答案很简单:
new MemoryStream(image.Bytes)
我有一个 EmguCV.Image<Brg, Byte>()
实例和另一个第 3 方 API,它需要 Stream
表示图像数据。
我能够将 EmguCV 图像转换为流并使用 System.Drawing.Bitmap.Save
将其传递给第三方 API,但这不是很有效。
如何尽可能高效地获取流?
此代码有效:
var image = new Image<Rgb, byte>("photo.jpg");
var bitmap = image.Bitmap// System.Drawing - this takes 108ms!
using (var ms = new MemoryStream())
{
bitmap.Save(ms, ImageFormat.Bmp); //not very efficient neither
ms.Position = 0;
return ImageUtils.load(ms); //the 3rd party API
}
我尝试直接从图像创建 UnmanagedMemoryStream
:
byte* pointer = (byte*)image.Ptr.ToPointer();
int length = image.Height*image.Width*3;
var unmanagedMemoryStream = new UnmanagedMemoryStream(pointer, length);
但是当我尝试读取它时,它会抛出一个 AccessViolationException
:试图读取或写入受保护的内存。
for (int i = 0; i < length; i++)
{
//throw AccessViolationException at random interation, e.g i==82240, 79936, etc
unmanagedMemoryStream.ReadByte();
}
本例中的长度为 90419328,应该是正确的,因为它与 image.ManagedArray.Length;
具有相同的值如何在不复制数据的情况下获取流?
好的,在 Image() 上有 byte[] 类型的字节 属性 所以答案很简单:
new MemoryStream(image.Bytes)