Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » OpenGL » Chromakey und Opengl mit Image

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.02.2004, 16:59 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Die Indezes erscheinen mir ungültig,
aber schau mal (per Debugger) ob der Fehler bei

color_pic[BLUE]

oder bei

pic[index_blue]

liegt.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.02.2004, 12:43 Uhr
dad_an_der_fh



Also ich bin mit dem Debugger da mal durchgegeangen.
Er bricht bei
y = 13
und
x = 290
ab.

Hier die Daten:

x 290 int
y 13 int

width 320 int
height 240 int
bytes 4 int

index_green 17801 int
index_blue 17800 int
index_red 17802 int
index_alpha 17803 int

GREEN 1 int
BLUE 0 int
ALPHA 3 int
RED 2 int

- dataPtr 0x052d0040 "¸¹´" unsigned char *
184 '¸' unsigned char
- pic 0x01ad4a78 "Data/gfx/nice.bmp" unsigned char *
68 'D' unsigned char

xsize 320 int
ysize 240 int

- color_pic 0x0012fd68 "îþîþ÷ýû" unsigned char [4]
[0] 238 'î' unsigned char
[1] 254 'þ' unsigned char
[2] 238 'î' unsigned char
[3] 254 'þ' unsigned char

- color 0x0012fd6c "÷ýû" unsigned char [4]
[0] 247 '÷' unsigned char
[1] 253 'ý' unsigned char
[2] 251 'û' unsigned char
[3] 0 unsigned char

Finde da leider keine Info wo es hängt?

Gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.02.2004, 22:33 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


geb mal in die überwachung


C++:
pic[index_blue]



ein, an der stelle wo er abstürzt (am besten einzeln durchgehen)
was da dann dasteht. Ich denke mal einfach das der index > die größe des arrays ist...
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ OpenGL ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: