Ce qui suit est juste une théorie et pourrait ne pas fonctionner, je ne suis pas très expérimenté avec OpenCV/emgucv
Les deux System.Drawing.Bitmap
et Emgu.CV.Image
ont des constructeurs prenant scan0
comme argument. Vous pouvez allouer de la mémoire pour l'image et passer ce pointeur à ces constructeurs. mémoire peut être alloué par var ptr = Marshal.AllocHGlobal(stride*height)
(ne pas oublier de libérer) ou en allouant un tableau géré de taille suffisante et en acquérant son adresse. Adresse peut être aquired façon suivante:
var array = new byte[stride*height];
var gch = GCHandle.Alloc(array, GCHandleType.Pinned);
var ptr = gch.AddrOfPinnedObject();
Cela a également tableau « pins », il ne peut donc être déplacé par éboueur et l'adresse ne changera pas.
Nous allons utiliser ces constructeurs:
Bitmap(int width, int height, int stride, PixelFormat format, IntPtr scan0);
Image<Bgr, Byte>(int width, int height, int stride, IntPtr scan0);
width
et height
arguments sont explicites. format
pour bitmap est PixelFormat.Format24bppRgb
. stride
est la quantité d'octets pour une seule ligne d'image, il doit également être aligné (être un multiple de 4). Vous pouvez l'obtenir de cette façon:
var stride = (width * 3);
var align = stride % 4;
if(align != 0) stride += 4 - align;
Et scan0
est un pointeur sur notre bloc de mémoire.
Donc, je suggère qu'après avoir créé System.Drawing.Bitmap
et Emgu.CV.Image
en utilisant ces constructeurs utilisera le même bloc de mémoire. Si ce n'est pas le cas, cela signifie que opencv ou bitmap ou les deux bloc de mémoire fourni de copie et la solution possible (s'il existe) ne vaut certainement pas la peine efforts.
Par curiosité: dans quel but? – Amy
Il s'agit d'un système hérité qui utilise beaucoup GDI. Je voudrais utiliser OpenCV pour créer une image, et la mélanger avec le reste du système, qui utilise GDI pour le dessin. Pour obtenir l'image dans GDI, j'utilise un bitmap. S'il y a un moyen plus direct de passer d'OpenCV à un objet "Graphics" GDI, cela m'intéresserait aussi. – Sean