Reconnaissance des couleurs (Rubik's Cube)

basesim Messages postés 79 Statut Membre -  
basesim Messages postés 79 Statut Membre -
Bonjour,
J'aimerais savoir comment reconnaitre les différentes couleurs d'un Rubik's Cube.
J'ai accès au valeur RGB et HSV de chaque carré de chaque face.

Voici le code que j'utilise pour la saisie des valeurs RGB et la transformation en HSV :

Faces getAverage (SDL_Surface *surface, SDL_Rect aera) 
{ 
    int curX=0; 
    int curY=0; 
    Uint8 curR=0; 
    Uint8 curG=0; 
    Uint8 curB=0; 
    double r=0,g=0,b=0,h=0,s=0,v=0,max=0,min=0; 

    Faces value; 
    value.tColor[0]=0; 
    value.tColor[1]=0; 
    value.tColor[2]=0; 
    value.color=0; 

    SDL_LockSurface(surface); 
    for(curX=aera.x;curX<(aera.x + aera.w);curX++) 
    { 
              for(curY=aera.y;curY<(aera.y +aera.h);curY++) 
        { 

            SDL_GetRGB(getpixel(surface,curX,curY),surface->format,&curR,&curG,&curB); 
            r += curR; 
            g += curG; 
            b += curB; 
        } 
    } 
    SDL_UnlockSurface(surface); 

    r /= (aera.w * aera.h * 255); 
    g /= (aera.w * aera.h * 255); 
    b /= (aera.w * aera.h * 255); 

    if(r>=g&&r>=b) 
        max=r; 
    if(g>=r&&g>=b) 
        max=g; 
    if(b>=r&&b>=g) 
        max=b; 
    if(r<=g&&r<=b) 
        min=r; 
    if(g<=r&&g<=b) 
        min=g; 
    if(b<=r&&b<=g) 
        min=b; 

    if (max==min) 
    { 
        h=0; 
 } 
 else if (max==r && g>=b) 
 { 
  h=60*(g-b)/(max-min)+0; 
 } 
 else if (max==r && g<b) 
 { 
  h=60*(g-b)/(max-min)+360; 
 } 
 else if (max==g) 
 { 
  h=60*(b-r)/(max-min)+120; 
 } 
 else if (max==b) 
 { 
  h=60*(r-g)/(max-min)+240; 
 } 
 if (max==0) 
 { 
  s=0; 
 } 
 else 
 { 
  s=(1-(min/max)); 
 } 
 v=max; 

    value.tColor[0]=h; 
    value.tColor[1]=s; 
    value.tColor[2]=v; 
    return value; 
}


et celui que j'utilise pour la reconnaissance des couleurs :

for(i=0;i<6;i++) 
    { 
        for(j=0;j<9;j++) 
        { 
            for(k=0;k<6;k++) 
            { 
                switch(k) 
                { 
                    case BLUE: 
                        cube->face[i][j].diff[BLUE] = fabs(cube->face[i][j].tColor[0] - parameters.blueRef.tColor[0]); 
                        fprintf(stderr,"\ni%d j%d blue->%f",i,j,cube->face[i][j].diff[BLUE]); 
                        break; 
                    case GREEN: 
                        cube->face[i][j].diff[GREEN] = fabs(cube->face[i][j].tColor[0] - parameters.greenRef.tColor[0]); 
                        fprintf(stderr,"\ni%d j%d green->%f",i,j,cube->face[i][j].diff[GREEN]); 
                        break; 
                    case RED: 
                        cube->face[i][j].diff[RED] = fabs(cube->face[i][j].tColor[0] - parameters.redRef.tColor[0]); 
                        fprintf(stderr,"\ni%d j%d red->%f",i,j,cube->face[i][j].diff[RED]); 
                        break; 
                    case YELLOW: 
                        cube->face[i][j].diff[YELLOW] = fabs(cube->face[i][j].tColor[0] - parameters.yellowRef.tColor[0]); 
                        fprintf(stderr,"\ni%d j%d yellow->%f",i,j,cube->face[i][j].diff[YELLOW]); 
                        break; 
                    case ORANGE: 
                        cube->face[i][j].diff[ORANGE] = fabs(cube->face[i][j].tColor[0] - parameters.orangeRef.tColor[0]); 
                        fprintf(stderr,"\ni%d j%d orange->%f",i,j,cube->face[i][j].diff[ORANGE]); 
                        break; 
                    case WHITE: 
                        cube->face[i][j].diff[WHITE] = (fabs(cube->face[i][j].tColor[1]*360 - parameters.whiteRef.tColor[1]*360) + 
                                                        fabs(cube->face[i][j].tColor[2]*360 - parameters.whiteRef.tColor[2]*360))/2; 
                        fprintf(stderr,"\ni%d j%d white->%f",i,j,cube->face[i][j].diff[WHITE]); 
                        break; 
                    default: 
                        break; 
                } 
            } 
            if(parameters.mode==0) 
   { for(k=0;k<6;k++) 
    { 
        if(k>0 && cube->face[i][j].diff[k] < cube->face[i][j].diff[cube->face[i][j].color]) 
         cube->face[i][j].color=k; 
    } 
   } 
   fprintf(stderr,"\n(%d,%d) = (%f,%f,%f)\n",i,j,cube->face[i][j].tColor[0],cube->face[i][j].tColor[1],cube->face[i][j].tColor[2]); 
        } 
    } 
 if(parameters.mode==1) 
 { 
        for(k=0;k<6;k++) 
        { 
            for(i=0;i<6;i++) 
            { 
                for(j=0;j<9;j++) 
                { 
                    l=((i*9)+j); 
                    tab[k][l].y = i; 
                    tab[k][l].z = j; 
                    tab[k][l].diff = cube->face[i][j].diff[k]; 
                } 
            } 
        } 
        for(k=0;k<6;k++) 
        { 
            for(i=0;i<54;i++) 
            { 
                for(j=0;j<54;j++) 
                { 
                    if(tab[k][i].diff<tab[k][j].diff) 
                    { 
                        tmp=tab[k][i]; 
                        tab[k][i]=tab[k][j]; 
                        tab[k][j]=tmp; 
                    } 
                } 
            } 
        } 
        for(k=5;k>=0;k--) 
        { 

            for(i=0;i<9;i++) 
            { 
                if(cube->face[tab[1][i].y][tab[1][i].z].color==0) 
                    cube->face[tab[1][i].y][tab[1][i].z].color=1; 
            } 
            for(i=0;i<9;i++) 
            { 
                if(cube->face[tab[2][i].y][tab[2][i].z].color==0) 
                    cube->face[tab[2][i].y][tab[2][i].z].color=2; 
            } 

            for(i=0;i<9;i++) 
            { 
               if(cube->face[tab[5][i].y][tab[5][i].z].color==0) 
                    cube->face[tab[5][i].y][tab[5][i].z].color=5; 
            } 
            for(i=0;i<9;i++) 
            { 
                if(cube->face[tab[3][i].y][tab[3][i].z].color==0) 
                    cube->face[tab[3][i].y][tab[3][i].z].color=3; 
            } 
            for(i=0;i<9;i++) 
            { 
                if(cube->face[tab[4][i].y][tab[4][i].z].color==0) 
                    cube->face[tab[4][i].y][tab[4][i].z].color=4; 
            } 

        } 
 }


ainsi que le header qui leur est rattaché :

#ifndef DEF_COLORS 
#define DEF_COlORS 
#include <highgui.h> 

typedef enum Colors Colors; 
enum Colors {BLUE=0,GREEN=1,RED=2,YELLOW=3,ORANGE=4,WHITE=5,NONE=6}; 

typedef struct Faces Faces; 
struct Faces 
{ 
 double tColor[3]; 
 Colors color; 
 double diff[6]; 
}; 

typedef struct Rubik Rubik; 
struct Rubik 
{ 
 Faces face[6][9]; 

}; 

typedef struct Param Param; 
struct Param 
{ 
    Faces blueRef; 
    Faces greenRef; 
    Faces redRef; 
    Faces yellowRef; 
    Faces orangeRef; 
    Faces whiteRef; 
    int mode; 
    SDL_Rect area[9]; 
    int portID; 
}; 

typedef struct Data Data; 
struct Data 
{ 
 int y; 
 int diff; 
 int z; 
}; 

Uint32 getpixel(SDL_Surface *surface, int x, int y); 
Faces getAverage(SDL_Surface *surface, SDL_Rect aera); 
void detectColors(Rubik *cube); 

#endif


J'ai entre autre de la difficulté à différencier le orange du rouge et le blanc du jaune.
Pouvez-vous m'aider S.V.P ?

2 réponses

basesim Messages postés 79 Statut Membre 2
 
UP?
0
basesim Messages postés 79 Statut Membre 2
 
reUP?
0