如何有效地从EmguCV(OpenCV)图像获取流

时间:2015-09-25 13:07:34

标签: opencv pointers stream unmanaged emgucv

我有一个EmguCV.Image<Brg, Byte>()个实例和另一个第三方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具有相同的值;

如何在不复制数据的情况下获取流?

1 个答案:

答案 0 :(得分:0)

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

class AComparator3<T extends B<U>, U extends Comparable<U>> implements Comparator<T> {

    @Override
    public int compare(final T o1, final T o2) {
        U o1value = o1.getValue();
        U o2value = o2.getValue();
        return o1value.compareTo(o2value);
    }
}
...
AComparator3<A, Comparable<U>> comparator = sscce.new AComparator3();