Convertir un byte[] dans un Emgu/OpenCV Image
J'ai un tableau d'octets représentant une image en niveaux de gris que je voudrais utiliser avec openCV en C#, à l'aide de la Emgu wrapper. Je suis à essayer de comprendre comment le convertir en un Emu.CV.Image
sans d'abord le convertir en un System.Drawing.Bitmap
.
Jusqu'à présent, cette constructeur de Image
semble prometteuse. On dirait qu'il prend le pixel de lignes, de colonnes, et ensuite le tableau avec mes données pour construire une image. Cependant, il veut dans une drôle de format et je suis aux prises avec la façon de créer correctement la TDepth[,,] data
argument.
Voici ce que j'ai à ce jour:
//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]);
Visual studio, il est évident pour moi que de passage dans un tableau ne va pas le couper, mais je n'ai aucune idée de la façon de construire les nécessaires TDepth[,,]
objet avec mes données de pixels à passer dans la Image
constructeur.
Ce code doit s'exécuter à ~30fps, donc je vais essayer d'être aussi efficace que possible avec la création d'un objet, d'allocation de mémoire, etc.
Vous devez vous connecter pour publier un commentaire.
Une autre solution serait de créer un EMGU.CV.Image en utilisant seulement la largeur et la hauteur de l'image. Ensuite, vous pouvez faire quelque chose comme ceci:
Plus long que la largeur et la hauteur sont corrects et la largeur est divisible par 4(comment Emgu.CV.L'Image est mise en œuvre), il devrait y avoir aucun problème. Vous pouvez même réutiliser le Emgu.CV.L'Image de l'objet et il suffit de changer les octets de chaque image si vous n'avez pas besoin d'enregistrer les objets.
depthImage.Data[x, y] =
est environ 10x plus lent que cette).Personnellement, je voudrais faire quelque chose le long de ces lignes:
Pour des considérations de performance, vous voudrez probablement:
De l'uem.Cv.Image de la catégorie définie comme
TColor
Type de couleur de cette image (soit Gris, Bgr, Bvra, Hsv, Hls, de Laboratoire, de Câlins, Xyz, Ycc, Rvb ou Rbga)
TDepth
La profondeur de cette image (soit Octet, SByte, Simple, double, UInt16, ou Int32 Int16)
Ce paramètre générique TDepth est trompeuse. Dans votre cas
TDepth[,,]
signifiebyte[,,]
La copie d'un tableau à l'autre, vous pouvez utiliser la mémoire Tampon.BlockCopy:
var gcHandle = GCHandle.Alloc(depthPixelData, GCHandleType.Pinned); IntPtr address = gcHandle.AddrOfPinnedObject(); Image<Gray, Byte> depthImage = new Image<Gray, Byte>(depthBitmap.PixelHeight, depthBitmap.PixelWidth, colorChannels, address);
Mais probablement non géré la mise en œuvre sera mieux dans votre cas...