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?

War es hilfreich?

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top