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


  • Mod

    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ß


  • Mod

    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?!


Anmelden zum Antworten