Description en français :Bonjour à tous,
Comme promis dans la dernière rdp je publie ici la première version de mon algorithme de reconnaissance de sprite.
Comme on peut le deviner ce programme reconnait des sprites.
Au démarrage du programme, on se retrouve dans une interface utilisateur en locate, dans laquelle on peux dessiner le sprite de notre choix (actuellement de taille maximum 7*7 pixels). Puis on presse [EXE], la calto potasse quelques dixièmes de seconde et elle vous dit si le sprite donné est connu. Si oui, alors vous avez une réponse positive, sinon le programme l\'enregistre et sera capable de le reconnaître plus tards. Mieux, si ce sprite est référencé dans la petite base de données intégrée au programme, l'algo vous dit de quelle forme il s'agit. Actuellement les formes implémentées sont:
-carré de 2*2 px;
-carré vide de 3*3 px;
-cercle vide de 4px de diamètre;
-cercle vide de 5px de diamètre;
-pixel (point);
-croix de 3px de largeur.
Pour ceux qui ne veulent pas télécharger le programme, voici son code source:
Do
LpWhile Getkey<>0
0->A~Z
ClrText
'LIST MEM
"MEM"->List 1
If List 1[1]=0
Then 100->Dim List 1
"MEM"->List 1
1->List 1[1]
15->List 1[2]
495->List 1[3]
63903->List 1[4]
186->List 1[5]
4357252->List 1[6]
27030->List 1[7]
15255086->List 1[8]
IfEnd
'PICT BASE
[[0,0,0,0,0,0,0][0,0,0,0,0,0,0][0,0,0,0,0,0,0][0,0,0,0,0,0,0][0,0,0,0,0,0,0][0,0,0,0,0,0,0][0,0,0,0,0,0,0]]->Mat A
'PICT EDITOR
'_->_PICT LOAD
For 1->Theta To 7
For 1-><r> To 7
Mat A[Theta,<r>]=1=>Locate <r>,Theta,"_#E6A6_"
Next
Next
'_->_BACKGROUND
For 1-><r> To 7
Locate 8,<r>,"|"
Next
Red Locate 9,1,"Sprite Recon"
Blue Locate 9,3,"By Disperseur"
Black Locate 9,4,"Use [_#E690__#E692__#E693__#E691_]"
Black Locate 9,5,"and [SHIFT]"
Black Locate 9,6,"and [ALPHA]"
Black Locate 9,7,"then [EXE]"
'_->_POS INIT
1-><r>:1->Theta
Locate 1,1,"+"
'_->_MAIN LEAP
While 1
Do
LpWhile Getkey=0
If Mat A[Theta,<r>]=1
Then Locate <r>,Theta,"_#E6A6_"
Else Locate <r>,Theta," "
IfEnd
'_->_COMMANDS
<r><7=>Getkey=27=>Isz <r>
<r>>1=>Getkey=38=>Dsz <r>
Theta<7=>Getkey=37=>Isz Theta
Theta>1=>Getkey=28=>Dsz Theta
Getkey=78=>1->Mat A[Theta,<r>]
Getkey=77=>0->Mat A[Theta,<r>]
Locate <r>,Theta,"+"
Getkey=31=>Break
Do
LpWhile Getkey<>0
WhileEnd
ClrText
"Analyse.."
'FIRST POINT SEARCHING
For 1->Theta To 7
For 1-><r> To 7
If Mat A[Theta,<r>]=1
Then
<r>->A~B
Theta->C~D
Break
IfEnd
Next
Next
'SIZE DETERMINING
For 1->Theta To 7
For 1-><r> To 7
If Mat A[Theta,<r>]=1
Then
<r><A=><r>->A
<r>>B=><r>->B
Theta<C=>Theta->C
Theta>D=>Theta->D
IfEnd
Next
Next
'READING MAT DIM
{D-C+1,B-A+1}->Dim Mat B
'WEIGHT MAT DIM
{D-C+1,B-A+1}->Dim Mat C
For C->Theta To D
For A-><r> To B
Mat A[Theta,<r>]=1=>1->Mat B[Theta-C+1,<r>-A+1]
Next
Next
'WEIGHT MAT FILL
For 1->Theta To D-C+1
For 1-><r> To B-A+1
2^W->Mat C[Theta,<r>]
Isz W
Next
Next
'SOM CALC
0->S
For 1->Theta To D-C+1
For 1-><r> To B-A+1
S+(Mat B[Theta,<r>]*Mat C[Theta,<r>])->S
Next
Next
'SEARCH
"S="
SDisps
'IMAGES REFERENCEES
For 1-><r> To 100
If List 1[<r>]=S
Then "Connu"
Break
IfEnd
If List 1[<r>]=0
Then "Inconnu, enregistré"
S->List 1[<r>]
Break
IfEnd
Next
S=1=>"POINT"
S=15=>"CARRE 2*2"
S=495=>"CARRE 3*3"
S=63903=>"CARRE 4*4"
S=186=>"CROIX 3*3"
S=4357252=>"CROIX 5*5"
S=27030=>"CERCLE D=4"
S=15255086=>"CERCLE D=5"
ClrMat
Le petit bémol est que l'algo ne peux pas reconnaître plusieurs sprites regroupés. Pour parer à ce problème je cherche un moyen de détecter les différents sprites qui pourraient êtres présents dans l'image donnée au début.
Sur ce, si vous avez des questions (et je pense qu'il y en aura
) n'hésitez pas.
A+ sur Planet Casio