如何高效地从EmguCV(OpenCV)映像获取流

tzcvj98z  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(133)

我有一个EmguCV.Image<Brg, Byte>()示例和另一个第三方API,它需要表示图像数据的Stream
我能够使用System.Drawing.Bitmap.Save将EmguCV图像转换为流并将其传递给第三方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 either
   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的值相同;
如何在不复制数据的情况下获取流?

btxsgosb

btxsgosb1#

好的,Image()上有byte[]类型的Bytes属性,所以答案很简单:

new MemoryStream(image.Bytes)

相关问题