lundi 10 janvier 2011

Étape 7 : Placer les chiffres sur la photo

Traitement pour trouver la grille et les chiffres

Tous les chiffres sont trouvées. Il s'agit maintenant de les afficher sur la photo.

Afficher

Donc, maintenant, nous voulons seulement  afficher les chiffres sur la photo originale. Le défi est de donner la perspective originale pour les chiffres trouvés et d'appliquer cette perspective sur la photo. Pour ce faire, nous utilisons cette fois la miraculeuse méthode  setPolyToPoly de la classe Matrix. Mais, à première vue, ce n'est pas très facile à comprendre. Il m'a fallu beaucoup de temps pour bien utiliser la classe correctement.C'est pourquoi nous présentons le code exact de notre programme Java.

Voici quelques variables déjà définies :

bitmap : la photo originale de dimension 512X512
sudoku_dim : la dimension de la grille extraite (sudoku_dim = largueur = hauteur)
(x1,y1), (x2,y2), (x3,y3), (x4,y4) : les coordonnées des 4 coins de la grille sur la photo originale
sudoku_capture : les 81 chiffres trouvés (une cellule vide est représentée par un blanc)

 Voici le code complet :

Bitmap bitmap_to_display = bitmap.copy(Bitmap.Config.RGB_565, true);
    
float orig [] = new float [] {
            0, 0,
            sudoku_dim, 0,
            sudoku_dim, sudoku_dim,
            0, sudoku_dim
            };        
float dest [] = new float [] {
            (float) x1, (float) y1,
            (float) x2, (float) y2,
            (float) x3, (float) y3,
            (float) x4, (float) y4
            };

Matrix matrice = new Matrix();
matrice.setPolyToPoly(orig, 0, dest, 0, 4);
       
Canvas canvas;                  
canvas = new Canvas(bitmap_to_display);
canvas.setMatrix(matrice);
       
int width_square, height_square;                       
width_square = sudoku_dim / 9;
height_square = width_square;
                 
Paint paint_chiffre = new Paint();
paint_chiffre.setTextSize(34);
paint_chiffre.setTypeface(Typeface.DEFAULT_BOLD);
paint_chiffre.setColor(Color.GREEN);
     
String le_nombre;

int iimage, jimage;
int deb_x_square, deb_y_square;

int idx = -1;

for (iimage = 0; iimage < 9; iimage++) {
      deb_y_square = iimage * height_square + 12 + iimage * 2 / 3 ;
      for (jimage = 0; jimage < 9 ; jimage++){
        deb_x_square = jimage * width_square + 2 + jimage / 3; 
        idx++;           
        le_nombre = sudoku_capture.substring(idx,idx + 1);
        if (!le_nombre.equals(" "))
            canvas.drawText(le_nombre,
                        deb_x_square + 8, deb_y_square + 18,
                        paint_chiffre);                         
      }
}

image.setImageBitmap(bitmap_to_display);

Et ça marche!

Pour afficher les chiffres à n'importe quel angle de 0° à 360°, il s'agit de changer les points (x,y) en conséquence.

Dans les captures d'écrans des mêmes photos, nous voyons les chiffres avec la bonne perspective :






Aucun commentaire:

Enregistrer un commentaire