Chromakey und OpenGL mit Image
-
Hallo,
habe ein Problem beim Verbinden von Chromakey und OpenGL.
Ich hole mir über den Framebuffer ein Bild und ersetze vorgegebene Farbwerte
mit einer Farbe(blau). Dies schreib ich wieder in den Buffer zurück.
Nun jedoch möchte ich statt Blau ein anderes Bild sozusagen hinter mein Vorhandenes legen, das erste Bild also, als eine Art Schablone benutzen.// for the chroma keys int chromakey_x; int chromakey_y; unsigned char * pic = 0; //use a graphic-file char* graphicFile = 0; .. graphicFile = new char[18]; strcpy(graphicFile, "Data/gfx/nice.bmp" ); //for Chromakey chromakey_x = 0; chromakey_y = 0; .. unsigned char* applyChromaKey( unsigned char* dataPtr/*Bild 1 Lifestream von usb-cam*/, unsigned char* pic/*Bild 2*/, int xsize /*Größe von Bild*/, int ysize /*Größe von Bild*/) { if ( dataPtr == 0 ) return 0; if ( pic == 0 ) return 0; int width = xsize; int height = ysize; int bytes = 4; int BLUE = 0; int GREEN = 1; int RED = 2; int ALPHA = 3; // the CHROMA KEY :) //BGRA //int blue_min = 90; int blue_max = 195; //int green_min = 70; int green_max = 155; //int red_min = 50; int red_max = 125; //int alpha_min = -1; int alpha_max = 256; int index_red = 0; int index_green = 0; int index_blue = 0; int index_alpha = 0; // isn't changing ARUint8 color[4]; ARUint8 color_pic[4]; //ARUint8 KEY_COLOR[] = { 255, 0, 0, 0 }; //BGRA for ( int y=0; y<height; y++ ) { for ( int x=0; x<width; x++ ) { index_blue = x*bytes+y*width*bytes+BLUE; index_green = x*bytes+y*width*bytes+GREEN; index_red = x*bytes+y*width*bytes+RED; index_alpha = x*bytes+y*width*bytes+ALPHA; color[BLUE] = dataPtr[index_blue]; color[GREEN] = dataPtr[index_green]; color[RED] = dataPtr[index_red]; color[ALPHA] = dataPtr[index_alpha]; color_pic[BLUE] = pic[index_blue]; color_pic[GREEN] = pic[index_green]; color_pic[RED] = pic[index_red]; color_pic[ALPHA] = pic[index_alpha]; //grauwert zurückgeben if ( x==chromakey_x && y==chromakey_y ) { chromakey_blue = color[BLUE]; chromakey_green = color[GREEN]; chromakey_red = color[RED]; chromakey_alpha = color[ALPHA]; } if ( color[BLUE] > blue_min && color[BLUE] < blue_max && color[GREEN] > green_min && color[GREEN] < green_max && color[RED] > red_min && color[RED] < red_max && color[ALPHA] > alpha_min && color[ALPHA] < alpha_max ) { /*dataPtr[index_blue] = KEY_COLOR[BLUE]; dataPtr[index_green] = KEY_COLOR[GREEN]; dataPtr[index_red] = KEY_COLOR[RED]; dataPtr[index_alpha] = KEY_COLOR[ALPHA];*/ dataPtr[index_blue] = color_pic[BLUE]; dataPtr[index_green] = color_pic[GREEN]; dataPtr[index_red] = color_pic[RED]; dataPtr[index_alpha] = color_pic[ALPHA]; } } } return dataPtr; }
Jedoch hat er dabei Probleme mit der Größe meines übergebenen Bildes.
Er sagt Zugriffsverletzung bei der Übergabe von
color_pic[BLUE] = pic[index_blue];
color_pic[GREEN] = pic[index_green];
color_pic[RED] = pic[index_red];
color_pic[ALPHA] = pic[index_alpha];Kann mir jemand einen Tipp geben was ich falsch mache!
Gruß und Dank
-
pic ist nicht gross genug, wobei ich aus deinem source leider nicht sehen kann wie gross pic ist und wie gross es sein müßte.
rapso->greets();
-
Sorry, hab ich vergessen zu erwähnen.
Ich übergebe dem pic
mein Graphicfile.pic = (unsigned char*)graphicFile;
dabei war graphicFile = new char[18];
für
strcpy(graphicFile, "Data/gfx/nice.bmp" );
Wie groß soll ich pic machen?
Gruß
-
beide bilder müßten wohl gleich gross sein.
deine fragen klingen ziemlich absurt... eine relativ komplexe funktion geschrieben und weißt nicht was für parameter sie braucht
rapso->greets();
-
Naja, die Variablen sind ja klar, deren Größe eigentlich auch.
Ich wundere mich halt nur warum es net so will, wie es eigentlich söllte.
Es stimmt ja soweit alles.
Ich nahm an das ich irgendwo ein Gedankenfehler habe?GRuß
-
Vielleicht besitzt eines der Bilder keinen Alpha-Channel?!