Domanda

Sto cercando di scrivere un programma che prende un SDL_Surface, lo converte in un IplImage, usa il cvBlobsLib per trovare blob, dipinge le macchie come macchie di nuovo oltre l'immagine, quindi converte la IplImage uscita di nuovo ad un SDL_Surface.

Ho quasi finito: solo la conversione del IplImage di nuovo ad un SDL_Surface non è stato ancora fatto. Questo IplImage ha 3 canali dell'immagine ed è di 8 bit per pixel. Penso di avere due chiamate posso usare:

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);

Attualmente sto cercando con SDL_CreateRGBsurfaceFrom. Non ho idea, però, quali sono i valori corretti di passo, Rmask, Gmask e BMASK sono. (Amask è 0, perché non esiste un canale alfa.)

Qualcuno mi potrebbe aiutare a spiegare come fare questo?

Grazie!

Modifica : Ad esempio, questo è il codice ho provato ad usare:

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;
}

(Documentation SDL scrive "Pitch è la dimensione della linea di scansione della superficie, in byte, cioè widthInPixels * bytesPerPixel.") Questa uscite "Profondità 8, nchannels 3, passo 1920" e visualizza un'immagine completamente rosso. I pensare una soluzione sarebbe quello di convertire la mia immagine a 8-bit a 24-bit (1 byte per canale), ma non so come fare. Tutte le idee?

È stato utile?

Soluzione

Ok, ho capito di lavoro!

Credo stato confuso dal fatto che una profondità di 8 OpenCV mezzi un pixel ha 8 bit per canale, così in un'immagine 3-channel, un pixel ha 24 bit . Così, quando la conversione che al significato SDL di profondità, otteniamo bit 8 * 3 = 24.

L'immagine era 24 bit, dopo tutto, che supporta SDL. Quindi convertire l'immagine da SDL è semplice come:

SDL_Surface *surface = SDL_CreateRGBSurfaceFrom((void*)opencvimg->imageData,
                opencvimg->width,
                opencvimg->height,
                opencvimg->depth*opencvimg->nChannels,
                opencvimg->widthStep,
                0xff0000, 0x00ff00, 0x0000ff, 0
                );
return surface;

Ci scusiamo per la confusione, spero che questo aiuta qualcuno alla ricerca per la stessa risposta.

Altri link di interesse: http://www.libsdl.org/cgi/docwiki.cgi/Pixel_Access
E la subroutine completo a: http://paster.dazjorz.com/?p=3714

Altri suggerimenti

Prima di tutto: Grazie !!

Secondo: Funziona perfettamente con 3 immagini di canale ma voglio visualizzare un solo canale-IplImage

quindi ci andiamo:

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top