2015-09-25 6 views
0

У меня есть экземпляр EmguCV.Image<Brg, Byte>() и другой сторонний API, для которого требуется Stream, который представляет данные изображения.Как эффективно получать поток от изображения EmguCV (OpenCV)

Мне удалось преобразовать изображение EmguCV в поток и передать его стороннему API с помощью System.Drawing.Bitmap.Save, но это не очень эффективно.

Как получить поток как можно более аффилированным?

Этот код работает:

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 и shoudl быть правильным, поскольку он имеет такое же значение, как image.ManagedArray.Length;

Как получить поток без копирования данных?

ответ

0

Хорошо, есть Bytes свойство типа байт [] на Image(), так что ответ очень прост:

new MemoryStream(image.Bytes)