Wie ein OpenCV IplImage zu einem SDL_Surface konvertieren?
Frage
Ich versuche, ein Programm zu schreiben, die eine SDL_Surface
nimmt, wandelt es in ein IplImage
, verwendet die cvBlobsLib Blobs zu finden, die Blobs als Flecken zurück auf das Bild malt, dann wandelt die Ausgabe IplImage
auf ein SDL_Surface
zurück.
Ich bin fast fertig: nur die IplImage
Umwandlung hat zurück zu einem SDL_Surface
noch nicht geschehen ist. Diese IplImage hat 3 Bildkanäle und 8 Bits pro Pixel. Ich glaube, ich habe zwei Anrufe ich verwenden können:
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);
Ich versuche zur Zeit mit SDL_CreateRGBsurfaceFrom
. Ich habe keine Ahnung, aber was die korrekten Werte der Tonhöhe, Rmask, Gmask und BMASK sind. (AMASK 0 ist, weil es kein Alpha-Kanal ist.)
Kann mir jemand helfen, indem zu erklären, wie dies zu tun?
Danke!
Bearbeiten : Zum Beispiel ist dies Code, den ich zu verwenden versucht:
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 Dokumentation schreibt "Pitch ist die Größe der Scanlinie der Oberfläche, in Bytes, das heißt widthInPixels * bytesPerPixel.") Diese Ausgänge „Tiefe 8, nChannels 3, Pitch 1920“ und zeigt ein völlig rotes Bild. I denkt eine Lösung sei, mein 8-Bit-Bild zu 24 Bit (1 Byte pro Kanal) zu konvertieren, aber ich weiß nicht, wie das zu tun. Irgendwelche Ideen?
Lösung
Ok, ich habe es funktioniert!
Ich glaube, ich wurde durch die Tatsache, dass eine verwirrten OpenCV Tiefe von 8 Mitteln ein Pixel besteht aus 8 Bit pro Kanal, so dass in einer 3-Kanal-Bild, ein Pixel 24 Bits hat . Also, wenn das auf die SDL Bedeutung der Tiefe Umwandlung erhalten wir 8 * 3 = 24
Bits.
Das Bild war 24 Bits, nachdem alle, die SDL unterstützt. So Umwandeln des Bildes zu SDL ist so einfach wie:
SDL_Surface *surface = SDL_CreateRGBSurfaceFrom((void*)opencvimg->imageData,
opencvimg->width,
opencvimg->height,
opencvimg->depth*opencvimg->nChannels,
opencvimg->widthStep,
0xff0000, 0x00ff00, 0x0000ff, 0
);
return surface;
Sorry für die Verwirrung, ich hoffe das jemand für die gleiche Antwort der Suche hilft.
Weitere interessante Links:
http://www.libsdl.org/cgi/docwiki.cgi/Pixel_Access
Und das komplette Unterprogramm an:
http://paster.dazjorz.com/?p=3714
Andere Tipps
Zunächst einmal: Danke !!
Zweitens: Es funktioniert perfekt mit 3-Kanal-Bilder, aber ich möchte eine einkanalige-IplImage anzuzeigen
so dort gehen wir:
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;
}