IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Traitement d'image BMP


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut Traitement d'image BMP
    Bonjour, pour mon projet de fin d'année, je doit réaliser un poste de surveillance comprenant une webcam et un serveur d'image.

    L'acquisition de l'envoi de l'image se fait très bien, en revanche je dois faire une comparaison entre les 2 images pour déterminer une intrusion ou non.

    Je pars donc sur une méthode de binarisation d'image pour les comparer.

    Et c'est là où je demande de l'aide :'(
    Je n'y arrive pas du tout. Voila ce que j'ai jusqu'a présent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    struct y
    {
    unsigned char R;
    unsigned char V;
    unsigned char B;
    }pixel;
    //Binarisation
    int Bin()
    {
    FILE *fpbin,*finbin;
    unsigned char moyenne;
    int i,x,y;
    fpbin=fopen("image.bmp","r");
    finbin=fopen("imagenb.bmp","w+");
    fprintf(finbin,"P5\n320 240\n255\n");
     
    for(y=0;y<240;y++)
    {
    for(x=0;x<320;x++)
    {
    pixel.R=fgetc(fpbin);
    pixel.V=fgetc(fpbin);
    pixel.B=fgetc(fpbin);
     
    moyenne=(pixel.R+pixel.V+pixel.B)/3;
    i=(int)moyenne;
    if(i>=128)
    i=255;
    else
    i=0;
    putc(i,finbin);
    }
    }
    fclose(fpbin);
    fclose(finbin);
    return 0;
    }
    Le code marche très bien, un fichier bmp est créer mais il n'y a rien dedans :s

  2. #2
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut, juste pour savoir, est-ce qu'il y a une raison pour laquelle tu n'utilises pas un TBitmap?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Graphics::TBitmap *MonBitmap = new Graphics::TBitmap();
    Tu pourrais utiliser sa méthode LoadFromFile.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Mhhh en fait j'utilise un TBitmap lors de la conversion de bmp en jpg.

    Cependant je ne vois pas trop comment faire pour ce cas là :s.

  4. #4
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Bonsoir,

    si tu souhaite comparé exactement tes deux images (au pixel prêt) tu peux utiliser le hashage MD5. Tu effectue le hash MD5 de tes deux fichier *.bmp, et tu compare les signatures MD5 des fichiers. Si un seul pixel est différent, la signature sera totalement différente.
    C'est le plus simple a mettre en oeuvre si le but est de comparé exactement deux images. Si ton programme doit etre plus souple dans la comparaison, cette solution n'est pas adaptée.

    Bon courage
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta réponse sat83, malheuresement, je dois faire une comparaison avec un un seuil de différence donc ce n'est pas au pixel près

  6. #6
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Citation Envoyé par Hitonari Voir le message
    Mhhh en fait j'utilise un TBitmap lors de la conversion de bmp en jpg.

    Cependant je ne vois pas trop comment faire pour ce cas là :s.
    Pour loader un bitmap on fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                Graphics::TBitmap *Bmp = new Graphics::TBitmap();
                const AnsiString Str="C:\\Program Files\\Borland\\CBuilder6\\MonImage.bmp";
                Bmp->LoadFromFile(Str);
    Ensuite, tu accèdes aux pixel de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for( int x = 0 ; x < Bmp->Width ; x++)
    {
       for( int y = 0 ; y < Bmp->Height ; y++)
       {
           //Bmp->Canvas->Pixels[x][y] ;
       }
    }
    Pour accèder aux couleurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      BYTE nRed   = GetRValue(ColorToRGB(Bmp->Canvas->Pixels[x][y]));
      BYTE nBlue  = GetBValue(ColorToRGB(Bmp->Canvas->Pixels[x][y]));
      BYTE nGreen = GetGValue(ColorToRGB(Bmp->Canvas->Pixels[x][y]));
    PS: J'ai pris un paquet de code ici et là et j'ai pas tester...
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  7. #7
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup, je pense que ca va beaucoup m'aider.
    Je vais travailler dessus et je posterai si j'ai des résultats ^^

  8. #8
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Me revoila hélas de retour ^^'...
    Bref j'ai essayer de voir ce que je pouvais faire avec tes bouts de code.

    ce qui ma donner ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    int Bin()
    {
            Graphics::TBitmap *Bmp = new Graphics::TBitmap();
                const AnsiString Str="image.bmp";
                Bmp->LoadFromFile(Str);
                int moyenne;
     
    for( int x = 0 ; x < Bmp->Width ; x++)
    {
       for( int y = 0 ; y < Bmp->Height ; y++)
       {
            BYTE nRed   = GetRValue(ColorToRGB(Bmp->Canvas->Pixels[x][y]));
            BYTE nBlue  = GetBValue(ColorToRGB(Bmp->Canvas->Pixels[x][y]));
            BYTE nGreen = GetGValue(ColorToRGB(Bmp->Canvas->Pixels[x][y]));
           moyenne=(nRed+nBlue+nGreen)/3;
           Bmp->Canvas->Pixels[x][y]=moyenne;
       }
    }Bmp->SaveToFile("imagegris.bmp");
     
    return 0;
    }
    Là ce qui cloche c'est que j'ai bien mon image, mais seulement en rouge :s. Je sens que c'est pas loin mais c'est pas encore ca..lol.
    Désolé de faire un peu le "faite tout pour moi" mais je suis vraiment bloqué

  9. #9
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Ton code fonctionne bien, dans le sens qu'il fait ce que tu as codé. Si tu veux avoir ton image en ton de gris, alors c'est ça que tu as besoin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
        Graphics::TBitmap *Bmp = new Graphics::TBitmap();
        Bmp->LoadFromFile("image.bmp");
        int moyenne;
     
        for(int x = 0 ; x < Bmp->Width ; x++)
        {
            for(int y = 0 ; y < Bmp->Height ; y++)
            {
                BYTE nRed   = GetRValue(ColorToRGB(Bmp->Canvas->Pixels[x][y]));
                BYTE nBlue  = GetBValue(ColorToRGB(Bmp->Canvas->Pixels[x][y]));
                BYTE nGreen = GetGValue(ColorToRGB(Bmp->Canvas->Pixels[x][y]));
     
                moyenne = (nRed * 77 + nGreen * 150 + nBlue * 28) / 255;
                moyenne = (moyenne << 16) | (moyenne << 8) | moyenne;
     
                Bmp->Canvas->Pixels[x][y] = (TColor)moyenne;
            }
        }
        Bmp->SaveToFile("imagegris.bmp");
        delete Bmp;
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  10. #10
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Cela marche parfaitement ^^ Encore merci pour ton aide.

    Il ne me reste plus qu'a modifier mon code pour pouvoir prendre 2 images en différés pour permettre la comparaison ^^.

  11. #11
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Si tout fonctionne ou sinon quand tout fonctionnera n'oublie pas de cliquer sur le bouton pour indiquer que le problème a été réglé.

    Si tu t'intéresse au traitement d'image avec BCB tu devrais apprendre beaucoup en visitant le site Web suivant: http://homepages.borland.com/efg2lab
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  12. #12
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Me revoila (encore une fois lol).

    Voila voila, j'ai essayer plusieur chose, mais il y a une chose essentielle qui ne marche pas. Pourtant je pense que ca doit être simple mais je n'arrive pas a trouver.

    Je dois prendre une image toute les 0,5s et la comparé avec celle d'avant.
    mon code pour enregistrer l'image est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    capFileSaveDIB(capvideo,"image.bmp");
    Grace a un timer je fais repeter ceci toutes les 500ms.

    Suite a celà j'ai penser a rajouter une valeur au nom de l'image pour qu'il enregistre a chaque fois 2 images, une "image0.bmp" a t=0s et "image1.bmp" a t=0,5s etc etc.

    Je pense que cela a l'air simple, cependant tout ce que j'arrive a faire se résume a enregistrer les images en boucle image1,image2,image3,image4...etc sans que cela revienne entre 0 et 1.
    A cause de celà je ne peux pas faire la comparaison.

    edit: j'ai penser a utiliser strcat, strcpy mais je n'arrive pas a l'appliquer ici.

  13. #13
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut, je suis désolé je ne comprend pas ton problème de manipulation de string.

    Est-ce que tu pourrais mettre un peu de code et ré-expliquer se qui ne fonctionne pas.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  14. #14
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    En fait, j'enregistre mon image toutes les 0,5s.
    Ensuite je la converti en gris.

    Ce que j'aimerai moi, c'est prendre une image, puis une autre à 0,5s mais avec un nom différent de manière à avoir 2 images prisent l'une après lautre.

    Voila ce que j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       Timer1->Enabled=true;
       //sauvegarde dans le répertoire courant
       capFileSaveDIB(capvideo,"image.bmp");
       Bmp2Jpg();
       Bin();
       // affichage de l'image sauvegardée
       Image1->Picture->LoadFromFile("image.jpg");
    Donc je lance le timer, puis j'enregistre ma première image, je la convertie (bmp->jpg) et je la transforme en niveau de gris. J'affiche alors mon image jpeg non grisé dans un TImage pour m'assurer que la conversion bmp->jpg s'est bien passée. Afficher l'image grisé ne m'interesse pas puisque seule, la valeur "moyenne" m'interesse.
    Ma demande est donc, n'y a-t-il pas un moyen pour que je puisse enregistrer une image A, la stocker, puis enregistrer une autre image (image B), de manière a ce qu'a toutes les 0,5s, l'image B remplace l'image A et l'image B devienne une image fraichement prise (appelons la l'image C).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. traitement d'image BMP en C++
    Par HH.HalimK dans le forum C++
    Réponses: 6
    Dernier message: 30/12/2012, 02h40
  2. [Débutant] traitement image bmp
    Par ngossi dans le forum Images
    Réponses: 4
    Dernier message: 24/05/2011, 16h41
  3. [débutant] Traitement d'image: WMF ou bmp?
    Par Anthony17 dans le forum Delphi
    Réponses: 2
    Dernier message: 05/07/2006, 13h42
  4. Réponses: 5
    Dernier message: 15/01/2005, 18h29
  5. Création image BMP
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 16h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo