将 byte[] 转换为 Emgu/OpenCV 图像

QRo*_*hlf 3 c# opencv emgucv kinect

我有一个表示灰度图像的字节数组,我想使用 Emgu 包装器在 C# 中与 openCV 一起使用。我试图弄清楚如何将其转换为 anEmu.CV.Image而无需先将其转换为System.Drawing.Bitmap.

到目前为止,这个构造函数Image似乎很有前途。看起来它需要像素行、列,然后是包含我的数据的数组来构建图像。但是,它希望它们采用奇怪的格式,而我正在努力解决如何正确构建TDepth[,,] data参数的问题。

这是我到目前为止所拥有的:

// This gets initialized in the constructor and filled in with greyscale image data elsewhere in the code:
byte[] depthPixelData

// Once my depthPixelData is processed, I'm trying to convert it to an Image and this is where I'm having issues
Image<Gray, Byte> depthImage = new Image<Gray, Byte>([depthBitmap.PixelHeight, depthBitmap.pixelWidth, depthPixelData]);
Run Code Online (Sandbox Code Playgroud)

Visual Studio 对我来说很明显,仅仅传入一个数组并不会削减它,但我不知道如何TDepth[,,]用我的像素数据构造必要的对象以传递给Image构造函数。

这段代码需要以 ~30fps 的速度运行,所以我试图在对象创建、内存分配等方面尽可能高效。

And*_*sen 6

另一种解决方案是仅使用图像的宽度和高度创建一个 EMGU.CV.Image。然后你可以做这样的事情:

byte[] depthPixelData = new byte[640*480]; // your data

Image<Gray, byte> depthImage = new Image<Gray, byte>(640, 480);

depthImage.Bytes = depthPixelData;
Run Code Online (Sandbox Code Playgroud)

只要宽度和高度正确并且宽度可以被4整除(Emgu.CV.Image是如何实现的)应该没有问题。如果不需要保存对象,您甚至可以重用 Emgu.CV.Image 对象,只需更改每一帧的字节即可。