Images Bitmap

Signaler
Messages postés
10
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
30 avril 2007
-
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
-
Bonjour a tous,
Je suis actuellement en 2eme année d'un BTS Iris (Informatique et réseau pour l'industrie et les services techniques ^^)
et je dois realisé un projet de fin d'étude qui compte dans l'obtention de mon diplome.

Ce projet consiste a prendre une photo de plaque d'immatriculation avec une Webcam de la traiter et de recupere les caracteres sous formes de chaines de caracteres !

Mais j'ai un problème : Je stock la donnée d'une image dans un tableau a une dimension et je voudrait stocker cette donnée dans un tableau a 2 dimensions.
Je ne maitrise pas tres les tableaux a 2 dimension surtout qu'il doit etre dynamique.

Si quelqu'un aurait un tuyau s'il vous plait car la je peche serieux et l'examen c'est dans un mois

Merci d'avance

15 réponses

Messages postés
15020
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 avril 2021
94
Salut,
Si tu connais la taille de ton image, tu ne devrais pas avoir de souci: soit Width la largeur de ton image, Tab ton tableau de données et Matrix ton tableau à 2 dimensions. Le 1er pixel de la 2e ligne se trouve à Tab[Width+0] et tu dois le stocker dans Matrix[1][0]. En généralisant, ça donne ceci:
Matrix[i][j]=Tab[i*Width+j]

Je te conseille de faire un dessin au lieu de te triturer les méninges avec le code

N"hésites pas si tu as des questions...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
salut,

pour compléter l'explication de Buno qui se limite au remplissage, voilà une explication que j'espère digérable sur la technique de création/accès/suppression des tableaux en programmation :

    - à moins que ton image soit en noir et blanc, le tableau aura trois dimensions.
    - un tableau à deux dimensions est un tableau à une dimension(1) dont chaque case contient un tableau à une dimension(2).
       - autrement dit, tu déclares le tableau :                int ** Tableau;   // pointeur sur l'ensemble
       - ensuite tu déclares la première partie (1) :         Tableau = new int * [nblignes];   // pointeur sur début de ligne
       - enfin pour i de 0 à nblignes-1, tu déclares (2) :  Tableau[i] = new int [nbcolonnes]; // pointeur sur colonne de ligne en cours

tu peux rajouter autant de dimensions que tu veux, soit encore une troisième pour RGB : Tableau[i][j] = new int [3]; ne pas oublier les étoiles à rajouter. le nombre d'étoiles indique le nombre de dimensions qu'il faut atteindre. Les[] fonctionnent un peu de la même manière :   
                  T : niveau 0 (tableau général) ;
                  T[] : niveau 1 (ligne spécifique) ;
                  T[][] : niveau 2 (colonne spécifique de la ligne spécifique) etc...

Le repérage se fait donc à la manière d'une matrice : Tableau[i][j][0] = R;    Tableau[i][j][1] = G;    Tableau[i][j][2] = B;

Ne pas oublier de procéder aux delete des tableaux dynamiques en fin d'utilisation ou fermeture de programme de la même manière que la création soit :

for (int i =0;i<nblignes;i++)
{
    for (int j=0;j<nbcolonnes;j++)
       delete Tableau[i][j];         // pointeur sur case RGB
    delete Tableau[i];               // pointeur sur ligne
}
delete Tableau;                      // pointeur sur le tableau

Nota : si tu as besoin de te servir des couleurs et que tu te rends compte que c'est un peu n'importe quoi, c'est parce que dans un bmp, elles sont en réalité enregistrées à l'envers (BGR au lieu de RGB) et p-e même de droite à gauche mais je ca j'en suis plus sur.

cela dit je voudrais pas être défaitiste mais si tu pèches sur la maitrise des tableaux dynamiques et qu'il faut que tu fasses un algo de reconnaissance de caractère...

ca serait intéressant que tu mettes tes sources sur le site une fois que ca fonctionnera, ca m'intéresserait de voir comment tu as fait.
bon courage

Loki
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
les [] sont des [ ] sans espace

Loki
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Allocateur pour pointeur de pointeurs



Pourquoi personne ne pense jamais à cette méthode et alloue la mémoire séparément pour chaque pointeurs ?
Est-elle si mauvaise ? (Sérieusement je demande. Si un pro (BruNews par exemple) passait par ici...)
En tout cas, elle est beaucoup plus rapide.

C++ (@++)<!--
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
A première vue c'est sensiblement le même principe. mais perso j'y trouve plus compliqué et plus le bordel. de plus malloc et free sont des commandes C pur et le but c'est de se tourner vers le c++. en tous cas pour un débutant l'allocation que j'ai proposé me parait plus simple à comprendre.

Loki
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
C'est très très loin d'être la même chose. La méthode traditionnelle (allocation pour chaque pointeurs) est extrêmement lente tant pour l'allocation que pour le libération de la mémoire car à chaque tour de boucle, new et delete (ou malloc et free qui font partie de la stdlib. De toute façon, new et malloc reviennent à appeler HeapAlloc je crois) doivent être appelés à chaque fois.
Ma méthode alloue toute la mémoire nécessaire d'un coup (un seul appel à l'allocateur) et fait pointer les pointeurs sur une portion égal de la zone réservé. Quand on en a fini, un simple free (ou delete) suffis. Le gain de vitesse est significatif.

D'ailleurs, ce code peut très facilement être "recodé" en C++.

Si on se donne la peine de bien comprendre le code, on se rend compte qu'il n'y a rien de bien compliqué n'y de bordélique la dedans.
C++ (@++)<!--
Messages postés
10
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
30 avril 2007

Merci a tous pour vos reponses!

Enfaites, Jai une image(bmp) en Noir&blanc ( 1 pixel tout noir (0 0 0) ou tout blanc (255 255 255)) en 24bits et je voudrais la "transformée" en bitmap 8bits et stocké cette imae dans un tableau a deux dimensions ( la 8bits) !

Voila en faites mon probleme....
Merci d'avance
SaiBot
Messages postés
10
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
30 avril 2007

Buno merci de ta reponse,
J'ai essayé la formule que tu m'as donnée mais je crois que y'a un truc que je pige pas : soit la formule Matrix[i][j]=Tab[i*Width+j]. Si je suis a le premiere ligne premiere colonne (i = j = 0) ce qui nous donne Matric[0][0] = Tab[0*Width+0] soit Tab[0]. Donc c'est ok pour l'instant. Mais c'est la que je me pose des questions : Si je passe au pixel suivant => Matrix[0][1] = Tab[0*Width+1] soit Tab[0]. La je pense que soit y'a un truc que je ne comprends pas ou j'ai loupé un épisodes.
Ne faut il pas mettre des parentheses comme ceci => Tab[(i*Width)+j] ????
Messages postés
15020
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 avril 2021
94
Attention! Tu as mal lu: Tab[i*Width+j]. Si i et j =0, cela donne effectivement Tab[0]. Mais si i=0 et j=1, on a Tab[1].
A moins, bien sûr, qu'on ait changé les priorités des opérateurs sans me prévenir...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Messages postés
10
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
30 avril 2007

Honte a moi !!!!!!!!!!!
Je viens de me rendre compte de ma conneries j'ai plus penser a la priorité des operateurs
Dsl d'avoir mis tes connaissances en doutes buno ...
Messages postés
15020
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 avril 2021
94
Pas de souci, je ne suis pas vexé
Tiens-nous au courant de l'avancée de tes travaux...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Messages postés
10
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
30 avril 2007

Ba justement j'ai un tout ti peu avancer lol!
Déja merci Buno pour ta formule elle marche au poil !
Maintenant sa se corse et j'ai un autre probleme : l'image stocké dans le tableau a une dimension fait 41,2Ko environ.
Mais quand je veut ecrire l'image stocké dans le tableau a 2 dimensions l'image que je recupere est toute blanche et ne fait ke 13,8Ko.
Je vous montre le code :
-------------------------------------------------------------------------------------------------------------
    int i=0,j=0,index=0;
    FILE* file;
   
    for(i=0;i<52;i++)
    {
        for(j=0;j<272;j++)
        {
            index = (i*272)+j;
            tabPixels[i][j]=tabPlaque[index];
        }
    }
    file = fopen("C:\\capture\\test.bmp","w");
    //Ecriture de l'en-tete du fichier
    fwrite(&bmpfileh,sizeof(BITMAPFILEHEADER),1,file);
    //Ecriture de l'en-tete de l'image
    fwrite(&bmpinfoh,sizeof(BITMAPINFOHEADER),1,file);
//    fwrite(tabPlaque,nbrOctets,1,file);
    for(i=0;i<52;i++)
    {
        for(j=0;j<272;j++)
        {
            fwrite(&tabPixels[i][j],1,1,file);
        }
    }
    //fermeture du fichier
    fclose(file);
}
-------------------------------------------------------------------------------
Je ne voit pas d'erreur et le compilateur ne me signale rien c rageant je suis presque a la fin....
Donc si quelqu'un a deja pratiquer....SVP !!! SAUVEZ MOI !!!!!
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
es tu sur de tes commandes d'écriture d'entête de fichier et d'image ?

Loki
Messages postés
15020
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 avril 2021
94
L'erreur qu'il peut y avoir c'est que tu lis des pixels, donc RGB. Donc, tabPixels et tabPlaque doivent être des tableaux de pixels.
Autrement dit, chaque élément du tableau est une structure à 3 champs: R, G et B

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
je suis d'accord avec Buno pour ce qui est du tableau à une dimension. en revanche l'image résultat peut faire 8 bits sans problème, donc une structure à un seul champ dans un tableau à deux dimensions. de plus tu peux/dois sauter de 3 en 3 dans la lecture de ton tableau à une dimension puisque R = G = B et que dans le tableau à une dimension tu as les infos de la forme : R-G-B-R-G-B-R-G-B

Loki