OpenCV从字节数组创建Mat

use*_*884 11 c# c++ opencv

在我的C++ DLL中,我从字节数组创建Mat:

BYTE * ptrImageData;  //Image data is in this array passed to this function

Mat newImg = Mat(nImageHeight, nImageWidth, CV_8UC3, ptrImageData);
Run Code Online (Sandbox Code Playgroud)

使用一些灰色阴影而不是原始阴影创建图像.

这是从字节数组创建Mat的正确方法吗?

请参阅代码

ptrImageData从C#代码传递给C++ DLL.

传递图像数据的C#代码

System.Drawing.Image srcImage //Has the image
MemoryStream ms = new MemoryStream(); 
Marshal.FreeHGlobal(ptrImageData); 
srcImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
byte[] imgArray = ms.ToArray();
ms.Dispose();


int size1 = Marshal.SizeOf(imgArray[0]) * imgArray.Length;
IntPtr ptrImageData = Marshal.AllocHGlobal(size1);
Marshal.Copy(imgArray, 0, ptrImageData, imgArray.Length);

//Calling C++ dll function
ProcessImage(ptrImageData, srcImage.Width, srcImage.Height);

Marshal.FreeHGlobal(ptrImageData);
Run Code Online (Sandbox Code Playgroud)

小智 0

是的,这是从字节数组创建 Mat 的一种方法。您只需要小心您的数组包含您认为它的功能即可。

该图像是用一些灰色阴影创建的,而不是原始图像。

那么您在 newImg 中获得了图像吗?原始数据的像素格式是什么?

也许您已经切换了红色和蓝色通道。以下行将交换通道:

cv::cvtColor(newImg,swappedImg,CV_RGB2BGR);
Run Code Online (Sandbox Code Playgroud)