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?

Était-ce utile?

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top