OpenCV créer des Tapis de tableau d'octets

Dans ma dll C++ je suis la création de Tapis de tableau d'octets:

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

Mat newImg = Mat(nImageHeight, nImageWidth, CV_8UC3, ptrImageData);

L'image est créée avec une certaine nuance de gris ne pas l'original.

Est-ce la bonne façon de créer des Tapis de tableau d'octets?

Veuillez voir le code

ptrImageData est passé au C++ dll à partir de code C#.

Code C# pour transférer les données d'image

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);
Je pense que votre code C++ a une erreur, Tapis de newImg(...), ou Mat* newImg = new Mat(..), votre écriture n'est pas style C++.
le code est correct. Dans le code ci-dessus, newImg est en cours d'initialisation à l'aide de la explicit constructeur de la Mat classe.
Veuillez fournir des codes plus détaillés, par exemple comment afficher une image, quelle est la disposition de ptrImageData.
veuillez voir le édités question avec le code
Pourquoi êtes-vous enregistrer votre image en JPEG lorsque vous voulez vraiment cru octets? Êtes-vous sûr de l'octet formats de System.Drawing.Image et cv::Mat match? Pourquoi n'êtes-vous pas le formatage de l'exemple de code dans votre question?

OriginalL'auteur user1858884 | 2012-11-28