Come convertire un OpenCV IplImage a uno SDL_Surface?
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?
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;
}