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 :

recopier une zone d'image.


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Par défaut recopier une zone d'image.
    Bonjour a tous voila mon projet dans mon projet de fin d'année je doit détecter une plaque d'immatriculation sur un bmp puis extraire la zone de la plaque et la recopier dans un autre bmp.
    J'ai trouver ce code, mais cela ne marche pas :
    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("frame.bmp");
            int moyenne;
     
            for(int x = gaucheDePlaque ; x < droiteDePlaque ; x++)
            {
                    for(int y = basDePlaque ; y < hautDePlaque ; 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;
    Quelqu'un a t' il une idée... merci

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,
    J'ai trouver ce code, mais cela ne marche pas :
    Qu'est-ce qui ne marche pas ? Le numéro de la plaque n'est pas bon ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Par défaut
    Non je ne doit pas reconnaitre les caractères. Se qui ne marche pas c'est de recopier seulement une image de la zone de la plaque. il me recopie toute l'image en grisant la zone de la plaque.

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Tu crées un autre objet TBitmap, vide au départ. Connaissant la taille de la plaque, tu changes la taille du TBitmap de destination avec SetSize...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Par défaut
    Aurais-tu un exemple s'il te plais?

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Création du bitmap de destination
    Graphics::TBitmap *BmpDestination = new Graphics::TBitmap();
    // Init de la taille du bitmap
    BmpDestination->SetSize(largeurPlaque, hauteurPlaque);
    ...
    delete BmpDestination;
    Je te laisse de plaisir d'imaginer comment placer dans ce bitmap les pixels que tu as extraits de l'image de départ...
    Vu le code que tu as déjà, tu as 2 lignes à modifier...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Par défaut
    Merci pour tes réponses. Mais la fonction SetSize n'existe pas.

  8. #8
    Membre très actif Avatar de nirgal76
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 923
    Par défaut
    Citation Envoyé par flo291288 Voir le message
    Merci pour tes réponses. Mais la fonction SetSize n'existe pas.
    En C++ Builder 2007, elle existe en tout cas. tu es en quelle version ?
    en bcb 6, elle n'existe pas, donc tu devra le faire en 2 temps en modifiant les propriétés Width et Height

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Par défaut
    Merci cela fonctionne. Mon code :
    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
    void C_Image::copierPlaque()
    {
            Form1->Label2->Caption = gaucheDePlaque;
            Form1->Label6->Caption = droiteDePlaque;
            Form1->Label7->Caption = basDePlaque;
            Form1->Label14->Caption = hautDePlaque;
     
     
            Graphics::TBitmap *Bmp = new Graphics::TBitmap();
            Graphics::TBitmap *BmpDestination = new Graphics::TBitmap();
     
            BmpDestination->Height = Nbligne;
            BmpDestination->Width = Nbcolone;
     
     
     
            Bmp->LoadFromFile("frame.bmp");
     
            int moyenne;
     
            for(int x = hautDePlaque ; x < basDePlaque ; x++)
            {
                    for(int y = gaucheDePlaque ; y < droiteDePlaque ; y++)
                    {
                            BYTE nRed   = GetRValue(ColorToRGB(Bmp->Canvas->Pixels[y][x]));
                            BYTE nBlue  = GetBValue(ColorToRGB(Bmp->Canvas->Pixels[y][x]));
                            BYTE nGreen = GetGValue(ColorToRGB(Bmp->Canvas->Pixels[y][x]));
     
                            moyenne = (nRed * 77 + nGreen * 150 + nBlue * 28) / 255;
                            moyenne = (moyenne << 16) | (moyenne << 8) | moyenne;
     
                            BmpDestination->Canvas->Pixels[y-gaucheDePlaque][x-hautDePlaque] = (TColor)moyenne;
                    }
            }
            BmpDestination->SaveToFile("imagegris.bmp");
            delete BmpDestination;
    }
    seul bémol ,je récupère une image en niveau de gris si quelqu'un a une idée pour récupérer en couleur...

    En tous cas merci pour vos réponses.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Par défaut
    c'est bon cela fonctionne :
    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
    void C_Image::copierPlaque()
    {
            Form1->Label2->Caption = gaucheDePlaque;
            Form1->Label6->Caption = droiteDePlaque;
            Form1->Label7->Caption = basDePlaque;
            Form1->Label14->Caption = hautDePlaque;
     
     
            Graphics::TBitmap *Bmp = new Graphics::TBitmap();
            Graphics::TBitmap *BmpDestination = new Graphics::TBitmap();
     
            BmpDestination->Height = Nbligne;
            BmpDestination->Width = Nbcolone;
     
            BmpDestination->PixelFormat = pf24bit;
     
     
     
            Bmp->LoadFromFile("frame.bmp");
     
            int moyenne;
     
            for(int x = hautDePlaque ; x < basDePlaque ; x++)
            {
                    for(int y = gaucheDePlaque ; y < droiteDePlaque ; y++)
                    {
                            BmpDestination->Canvas->Pixels[y-gaucheDePlaque][x-hautDePlaque]=Bmp->Canvas->Pixels[y][x];
                    }
            }
            BmpDestination->SaveToFile("imageplaque.bmp");
            delete BmpDestination;
    }
    Merci à vous et à mon camarade de classe

  11. #11
    Membre très actif Avatar de nirgal76
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 923
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                            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;
    Ce code que tu as recopié (sans l'analyser apparemment) est justement un source de transformation d'une image couleur en niveau de gris.
    On prends les 3 composantes RVB (Rouge Vert Bleu) et on calcul le niveau de gris "moyenne". Puis on réaffecte ce niveau de gris calculé à chaque composante RVB (car quand elles sont égales, on a du gris !)
    Il est donc normal que les couleurs soient perdues.

    nb: et comme quoi les commentaires dans le code source, c'est important pour ceux qui le reprennent derrière.

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par défaut
    Citation Envoyé par nirgal76 Voir le message
    nb: et comme quoi les commentaires dans le code source, c'est important pour ceux qui le reprennent derrière.
    oh que oui et même pour relire mon code quand je repasse dedans

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

Discussions similaires

  1. aire d'une zone d'image
    Par g.amatou dans le forum Images
    Réponses: 2
    Dernier message: 27/05/2011, 10h20
  2. colorier une zone d'image dans une applet
    Par lou_ravi dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 16/11/2008, 22h34
  3. [Word][Modèles] Insertion d'une zone d'images
    Par unacsed dans le forum Word
    Réponses: 1
    Dernier message: 05/03/2007, 11h37
  4. Clic dans une zone deffini sur une image
    Par patoch76 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 30/04/2006, 12h07
  5. [MFC] Surlignage d'une zone d'une image
    Par eyghon dans le forum MFC
    Réponses: 6
    Dernier message: 06/04/2005, 19h12

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