Détection de formes simples dans une image.

Objectifs.

Votre mission si vous l'acceptez consiste à écrire un programme permettant de détecter la position et la taille d'une forme simple (rectangle ou rond) dans une image. Les formes sont pleines comme dans l'exemple ci-dessous.(Cf Demo)

Première mission.

Le proglet detectionForme vous propose une fonction createRandomShapeImage(s) permettant de générer automatiquement la forme à détecter dans une image de taille 400x400.
Votre première mission consiste à être capable de détecter un simple carré plein dans l'image. Il est important de noter que le fond de l'image ne comporte aucun bruit parasites ou autres formes géométriques. Seulement et uniquement un carré.
Voici la structure que doit avoir votre programme :
void main(){

// Creation de l'image de travail n°1 avec la forme a detecter

createRandomShapeImage(2);
    showImage(1);

// ICI l'appel à vos fonctions de detection

checkRandomShape(typeShape,posxShape,posyShape,taille,angle);
}
Une fois votre fonction de détection terminée vous pouvez faire appel à la fonction checkRandomShape pour tester vos résultats de détection
checkRandomShape(typeShape,posxShape,posyShape,taille,angle);
typeShape type de forme détectée String ("point" ou "square" ou "circle")
posxShape abscisse du coin haut gauche du carré englobant de la forme
posyShape ordonnée du coin haut gauche du carré englobant de la forme
taillelargeur du carré englobant (Valeur de 1 attendue pour la détection du point)
angle angle de la rotation subit par la forme (Valeur de 0 attendue pour la détection du point)
Remarque :
L'appel à createRandomShapeImage(2) avec la valeur 2 en paramètre permet de générer une forme carré pleine dans l'image.

Missions suivantes.

Une fois que vous aurez développé la fonction permettant de détecter le carré dans l'image, vous pourrez vous pencher sur les autres cas, générés là encore à l'aide de la fonction createRandomShape(s), où s de type int permet de sélectionner le scénario voulu suivant les valeurs : "
- (1) : détection d'un pixel.
- (2) : détection d'un carré.
- (3) : détection d'un cercle.
- (4) : détection cercle ou carré.
- (5) : détection d'un carré + rotation.
- (6) : détection d'un carré + rotation + bruit léger.
- (7) : détection d'un cercle + bruit léger.
- (8) : détection carré ou cercle + rotation.
- (9) : détection carré ou cercle + rotation + bruit.
- (10) : détection d'un carré + rotation + bruit fort.
- (11) : détection d'un cercle + bruit fort.
- (12) : détection carré ou cercle + rotation + bruit fort.

Un exemple de détection.

Le programme ci-dessous fait appel à la fonction createRandomShapeImage(1); qui créé une image blanche de 400x400 avec un unique pixel noir. Le but est de détecter la position de ce pixel et de l'entourer avec un cercle vert.
Voici une première solution possible :
import java.awt.Color;
void main(){

// attention l'image fait 400x400

int posx = 0;
int posy = 0;
boolean find = false;

// Creation de l'image de travail n°1 avec le point a detecter

    createRandomShapeImage(1);
    showImage(1);
    sleep(800);
    for (int x=0; ((x < 400) && (!find)); x++)
        for (int y=0; ((y < 400) && (!find)); y++)
            if (isPixelColor(1,x,y,Color.black)) {
                posx = x;
                posy = y;
                find = true;
            }
    System.out.println("posx : "+posx);
    System.out.println("posy : "+posy);
    drawRect(1,posx-3,posy-3,6,6,Color.green);
    showImage(1);
checkRandomShape("point",posx,posy,1,0);
}
Cliquez ici pour tester ce programme exemple
Voici une autre solution possible utilisant les fonctions pixMap
et utilisant une image de travail n°2 et la fonction showPipImage().
import java.awt.Color;
void main(){

// attention l'image fait 400x400

int [][] pixMap= new int[400][400];
int CodeBlack = codeCouleur(Color.black);
int posx = 0;
int posy = 0;
boolean find = false;

// Creation de l'image de travail n°1 avec le point a detecter

    createRandomShapeImage(1);
    showImage(1);
    sleep(800);
    loadImageToPixMap(1,pixMap);
    for (int x=0; ((x < 400) && (!find)); x++)
        for (int y=0; ((y < 400) && (!find)); y++)
            if (pixMap[x][y]==CodeBlack) {
                posx = x;
                posy = y;
                find = true;
            }
    System.out.println("posx : "+posx);
    System.out.println("posy : "+posy);
    drawRect(1,posx-3,posy-3,6,6,Color.green);
    showImage(1);
    checkRandomShape("point",posx,posy,1,0);

// On fait une copie de travail

    copyImage(1,2);
    drawRect(2,posx-3,posy-3,6,6,Color.green);
    showImage(2);
    sleep(800);
    showPipImage();
}
Cliquez ici pour tester ce programme exemple