Comment convertir un OpenCV IplImage à un SDL_Surface?
Question
Je suis en train d'écrire un programme qui prend une SDL_Surface
, le convertit en un IplImage
, utilise le cvBlobsLib pour trouver blobs, peint les blobs que les taches en arrière sur l'image, puis convertit la IplImage
de sortie vers un SDL_Surface
.
Je suis presque fait: que la conversion du IplImage
retour à un SDL_Surface
n'a pas encore été fait. Cette IplImage a 3 canaux d'image et est de 8 bits par pixel. Je crois avoir deux appels que je peux utiliser:
SDL_Surface *SDL_CreateRGBSurface(Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);
SDL_Surface *SDL_CreateRGBSurfaceFrom(void *pixels, int width, int height, int depth, int pitch, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);
J'essaie actuellement avec SDL_CreateRGBsurfaceFrom
. Je ne sais pas, cependant, que les valeurs correctes de terrain, Rmask, Gmask et BMASK sont. (AMASK vaut 0, car il n'y a pas de canal alpha.)
Quelqu'un pourrait me aider en expliquant comment faire?
Merci!
Modifier : Par exemple, ce code est j'essayé d'utiliser:
SDL_Surface *ipl_to_surface (IplImage *opencvimg)
{
int pitch = opencvimg->nChannels*opencvimg->width;
printf("Depth %d, nChannels %d, pitch %d\n", opencvimg->depth,
opencvimg->nChannels, pitch);
SDL_Surface *surface = SDL_CreateRGBSurfaceFrom((void*)opencvimg->imageData,
opencvimg->width,
opencvimg->height,
opencvimg->depth,
pitch,
0x0000ff, 0x00ff00, 0xff0000, 0
);
return surface;
}
(SDL Documentation écrit "Pitch est la taille de la ligne de balayage de la surface, en octets, à savoir widthInPixels * bytesPerPixel"). Cette sortie « Profondeur 8, nChannels 3, pas 1920 » et affiche une image complètement rouge. I penser une solution serait de convertir mon image 8 bits à 24 bits (1 octet par canal), mais je ne sais pas comment faire. Toutes les idées?
La solution
Ok, je l'ai travail!
je pense que je suis confondu par le fait qu'une profondeur de OpenCV de 8 moyens un pixel qui possède 8 bits par canal, de sorte que dans une image 3-canal, un pixel a 24 bits . Ainsi, lors de la conversion au sens que SDL de profondeur, nous obtenons bits 8 * 3 = 24
.
L'image était de 24 bits après tout, qui supporte SDL. Donc convertir l'image en SDL est aussi simple que:
SDL_Surface *surface = SDL_CreateRGBSurfaceFrom((void*)opencvimg->imageData,
opencvimg->width,
opencvimg->height,
opencvimg->depth*opencvimg->nChannels,
opencvimg->widthStep,
0xff0000, 0x00ff00, 0x0000ff, 0
);
return surface;
Désolé pour la confusion, je l'espère, cela aide tout le monde recherche la même réponse.
Autres liens d'intérêt:
http://www.libsdl.org/cgi/docwiki.cgi/Pixel_Access
Et le sous-programme complet à:
http://paster.dazjorz.com/?p=3714
Autres conseils
Tout d'abord: Merci !!
Deuxième: Il fonctionne parfaitement avec 3 images de la Manche, mais je veux afficher un monocanal-IplImage
là, nous allons:
SDL_Surface *single_channel_ipl_to_surface (IplImage *opencvimg)
{
SDL_Surface *surface = SDL_CreateRGBSurfaceFrom((void*)opencvimg->imageData,
opencvimg->width,
opencvimg->height,
opencvimg->depth*opencvimg->nChannels,
opencvimg->widthStep,
0xffffff, 0xffffff, 0xffffff,0);
return surface;
}