000
16.02.2004, 13:06 Uhr
dad_an_der_fh
|
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.
C++: |
// 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 |