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

2D Java Discussion :

Algorithme de comparaison de 2 images


Sujet :

2D Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Algorithme de comparaison de 2 images
    Bonjour
    Je cherche à faire une comparaison d'images.
    J'ai trouver un algo assez sympa et simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /*Prendre une première image, on récupère le nb de pixels noirs avec l'entier "noirs",
    stocker cette valeur dans une variable (comp1 ), on réalise la même chose avec la seconde image
       mais avec une variable différente (comp2 ), ensuite on fait
     
       if((comp2(tol 10%)>comp1) || (comp2(tol 10%)<comp1))
       envoyer 0 ou 1 (0 pour pas d'alerte et 1 pour alerte)
     
       */
    Le problème c'est que je fais une boucle pour récupérer l'image (et que j'envoie au client). L'image a toujours le même nom pour éviter de surcharger le disque.
    Voici 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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    package surveillance;
    //import pour le JavaMail
    //import javax.mail.*;
    //import javax.mail.internet.*;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.awt.image.PixelGrabber;
    import java.io.FileOutputStream;
    import java.io.IOException;
     
    import javax.media.*;
    import javax.media.control.FrameGrabbingControl;
    import javax.media.format.VideoFormat;
    import javax.media.protocol.DataSource;
    import javax.media.util.BufferToImage;
    import javax.swing.JFrame;
    import java.net.*;
    import java.io.*;
    import com.sun.image.codec.jpeg.*;
     
     
    public class Surveillanceserveur
    {
    //attribut de Surveillanceserveur
       static OutputStream out1;
       static Socket client = null;
       static BufferedReader in;
       static ServerSocket ecoute = null;
       static boolean connecte = false ;
     
        public Surveillanceserveur()
        {
            try {
                jbInit();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
     
        /**
         * jbInit
         */
        private void jbInit()
        {
        }
     
     
    /*-----------------DEBUT MAIN--------------------------------------*/
     
    public static void main(String[] args)
        {
    // CaptureDeviceInfo captureDevice = (CaptureDeviceInfo)
    // CaptureDeviceManager.getDeviceList(null).get(2);
     
    // récupération d'un périphérique à partir de son nom
        CaptureDeviceInfo captureDevice = CaptureDeviceManager.getDevice(
                "vfw:Microsoft WDM Image Capture (Win32):0");
    // récupération du MediaLocator lié au périphérique de capture
        MediaLocator mediaLocator = captureDevice.getLocator();
        try {
    // récupération d'une datasource à partir d'un MediaLocator
            DataSource ds = Manager.createDataSource(mediaLocator);
    // connexion sur la DataSource
            ds.connect();
     
    // connexion d'un player sur la datasource
            Player player = Manager.createPlayer(ds);
    // préparation du player et du périphérique
            player.realize();
            while (player.getState() != player.Realized);
     
    // création d'une fenêtre du résultat de la lecturee"
            JFrame frame = new JFrame();
    // ajoute le composant visuel lié au player
    //System.out.println("Avant");
            frame.getContentPane().add(player.getVisualComponent());
    //System.out.println("Apres") ;
            frame.pack();
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    // démarrage de la lecture
            player.start();
    // création serveur
            try {
                ecoute = new ServerSocket(2007); // Ouverture de la socket serveur
                System.out.println("Avant la connexion du poste");
            } catch (IOException ioe) {}
     
            while (true) {
                try {
                    client = ecoute.accept(); // Attente de connexion du client
                    connecte = true;
                    System.out.println("Connexion du poste");
                    in = new BufferedReader(new InputStreamReader(client.
                            getInputStream()));
                    out1 = client.getOutputStream();
                } catch (IOException ioe) {}
                ;
     
          // déclenche la capture d'image et envoi toutes les 1/2 secondes
     
                while (connecte == true) {
                    // récupère un contrôle sur le flux
                    FrameGrabbingControl fgc = (FrameGrabbingControl) player.
                                               getControl(
                            "javax.media.control.FrameGrabbingControl");
                    Buffer buf;
                    // récupère un Buffer contenant l'image demandée
                    buf = fgc.grabFrame();
                    // convertion du buffer en image (via BufferToImage)
                    BufferToImage btoi;
                    btoi = new BufferToImage((VideoFormat) buf.getFormat());
                    Image img;
                    // création de l'image
                    img = btoi.createImage(buf);
                    //conversion nuance gris & noir & comptage pixel noir
                    iObserver observer = new iObserver();
                    int width1 = img.getWidth(observer);
                    int height1 = img.getHeight(observer);
                    int[] rawPixels = getPixels(img, width1, height1);
                    int TailleImage = rawPixels.length;
                    int noirs = calculerPixelsNoirs(rawPixels, TailleImage);
                    System.out.println("NB noirs = " + noirs);
                    //méthode compareJPEG
                    //enregistrement image
                    saveJPEG(img, "screen.jpeg");
     
                    try
                     {
                        Thread.sleep(500);
                     } catch (InterruptedException ex) {}
                }
            }
        } catch (NoDataSourceException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (NoProcessorException e) {
                e.printStackTrace();
            } catch (NoPlayerException e) {
                e.printStackTrace();
            }
        }
    /*--------FIN MAIN---------------------------------------------*/
     
     
     
    /*----------METHODE saveJPEG---------------------------------------------*/
     
    public static void saveJPEG(Image img, String s)
        {
               BufferedImage bi = new BufferedImage(img.getWidth(null),
                                  img.getHeight(null), BufferedImage.TYPE_INT_RGB);
               Graphics2D g2 = bi.createGraphics();
               g2.drawImage(img, null, null);
               FileOutputStream out = null;
               try {
                           out = new FileOutputStream(s);
                   } catch (java.io.FileNotFoundException io) {}
                // création du fichier automatiquement si inexistant
     
                // encodeur JPEG
               JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
               // paramètres d'encodage
               JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
               param.setQuality(0.5f, false);
               // assignation des paramètres d'encodage
               encoder.setJPEGEncodeParam(param);
               try
                  {
                       // encodage de l'image
                       encoder.encode(bi);
                       out.close();
                   } catch (java.io.IOException io) {
                           System.out.println("IOException");
                      }
     
              try {
     
                  File f = new File(s);
                  int l = (int)f.length() ;
                  // Convertir l'entier l en tableau de bytes
                  byte b[] = new byte[4];
                  b[0] = (byte)(l & 0xFF );
                  b[1] = (byte)(l>>8 & 0xFF );
                  b[2] = (byte)(l>>16 & 0xFF );
                  b[3] = (byte)(l>>24 & 0xFF );
                  if (client.isConnected()==true)   out1.write(b);
                  else { connecte=false ; client.close();System.out.println("Deconnexion du poste");}
     
                  System.out.println(b[3]+" "+b[2]+" "+b[1]+" "+b[0]);
                  System.out.println("taille "+l);
                  JPEGImageEncoder encoder1 = JPEGCodec.createJPEGEncoder(out1);
                  // paramètres d'encodage
                  JPEGEncodeParam param1 = encoder.getDefaultJPEGEncodeParam(bi);
                  param1.setQuality(0.5f, false);
                  // assignation des paramètres d'encodage
                  encoder1.setJPEGEncodeParam(param);
                  try {
                          // encodage de l'image
                          encoder1.encode(bi);
     
                      if (client.isConnected()==true)    out1.flush();
                      else { connecte=false ; client.close();System.out.println("Deconnexion du poste");}
                        } catch (java.io.IOException io) {
                                   System.err.println("Interruption de la transmission par le client "+io);
                                     connecte=false ;
                               }
                       } catch (IOException ioe) {
                           System.err.println("erre "+ioe);
                           System.out.println("IOException 2222 "+ioe);
                            connecte=false ;
     
     
                       }
     
                   }
    //------------FIN METHODE saveJPEG------------------------------------------
     
     
     
     
    /*------------DEBUT METHODE getPixels----------------------------------------*/
     
       public static  int[] getPixels(Image parImage, int parWidth, int parHeight)
        {
            int[] bitmap = new int [parWidth * parHeight];
            PixelGrabber pg = new PixelGrabber (parImage, 0, 0, parWidth, parHeight,
                                                bitmap, 0, parWidth);
            try {
                pg.grabPixels ();
            }
            catch (InterruptedException e) {
                e.printStackTrace ();
            }
            return bitmap;
        }
    /*----------FIN METHODE getPixels----------------------------------------*/
     
     
     
    /*---------DEBUT METHODE calculerPixelsNoirs----------------------------*/
     
    public static  int calculerPixelsNoirs(int [] rawpixels , int tailleimage)
    	{
    	int red=0;
    	int green=0;
    	int blue=0;
    	int gris=0;
    	int NB = 0;
     
    	for (int i=0; i<tailleimage;i++)//conversion nuances gris & noir
    			{
    			int pixel = rawpixels[i] ;
    			red   = (pixel >> 16) & 0xff;
    			green = (pixel >>  8) & 0xff;
    			blue  = (pixel      ) & 0xff;
    			gris = (red+green+blue)/3 ;
    			if (gris <0x80)
                                NB++;
    			}
     
    	return NB ;
     
           // if(imageChanged(color1, color2))
           // {
            //  mailWarning = new EnvoiMail("ashkell@otaku-no-sekai.com");
             // try{
               //   this.sleep(200);
              //}
             //       catch(InterruptedException ie){
               //     }
            //}
     
          }
     
    }
    /*---------FIN METHODE calculerPixelsNoirs----------------------------*/
     
    /*--------METHODE compareJPEG-------------------------------*/
      /*Prendre une première image, on récupère le nb de pixels noirs avec l'entier "noirs",
    stocker cette valeur dans une variable (comp1 ), on réalise la même chose avec la seconde image
       mais avec une variable différente (comp2 ), ensuite on fait
     
       if((comp2(tol 10%)>comp1) || (comp2(tol 10%)<comp1))
       envoyer 0 ou 1 (0 pour pas d'alerte et 1 pour alerte)
     
       */
     /*
     public static int compareJPEG()
     {
     
     
     
     
     }
    */

  2. #2
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Si tu pouvais ne mettre que l'essentiel de ton code, ça serait plus facile à lire ...

  3. #3
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    oui là ça donne envie de plus qu'autre chose
    fais le tri et la solution viendra (peut etre...)à toi

    dans l attente

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Lol c'est vrai.

    Bon je vous mets ca

    Voici le main à partir de la création du serveur d'image
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    // création serveur
            try {
                ecoute = new ServerSocket(2007); // Ouverture de la socket serveur
                System.out.println("Avant la connexion du poste");
            } catch (IOException ioe) {}
     
            while (true) {
                try {
                    client = ecoute.accept(); // Attente de connexion du client
                    connecte = true;
                    System.out.println("Connexion du poste");
                    in = new BufferedReader(new InputStreamReader(client.
                            getInputStream()));
                    out1 = client.getOutputStream();
                } catch (IOException ioe) {}
                ;
     
          // déclenche la capture d'image et envoi toutes les 1/2 secondes
     
                while (connecte == true) {
                    // récupère un contrôle sur le flux
                    FrameGrabbingControl fgc = (FrameGrabbingControl) player.
                                               getControl(
                            "javax.media.control.FrameGrabbingControl");
                    Buffer buf;
                    // récupère un Buffer contenant l'image demandée
                    buf = fgc.grabFrame();
                    // convertion du buffer en image (via BufferToImage)
                    BufferToImage btoi;
                    btoi = new BufferToImage((VideoFormat) buf.getFormat());
                    Image img;
                    // création de l'image
                    img = btoi.createImage(buf);
                    //conversion nuance gris & noir & comptage pixel noir
                    iObserver observer = new iObserver();
                    int width1 = img.getWidth(observer);
                    int height1 = img.getHeight(observer);
                    int[] rawPixels = getPixels(img, width1, height1);
                    int TailleImage = rawPixels.length;
                    int noirs = calculerPixelsNoirs(rawPixels, TailleImage);
                    System.out.println("Nombres de pixels noirs = " + noirs);
                    //méthode compareJPEG
                    //enregistrement image
                    saveJPEG(img, "Screen.jpeg");
     
                    try
                     {
                        Thread.sleep(500);
                     } catch (InterruptedException ex) {}
                }
            }
        } catch (NoDataSourceException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (NoProcessorException e) {
                e.printStackTrace();
            } catch (NoPlayerException e) {
                e.printStackTrace();
            }
        }
    Le code qui permet de capturer l'image, la sauvegarde de l'image, sa mise en noir et blanc et récupère la taille de l'image
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    // création serveur
            try {
                ecoute = new ServerSocket(2007); // Ouverture de la socket serveur
                System.out.println("Avant la connexion du poste");
            } catch (IOException ioe) {}
     
            while (true) {
                try {
                    client = ecoute.accept(); // Attente de connexion du client
                    connecte = true;
                    System.out.println("Connexion du poste");
                    in = new BufferedReader(new InputStreamReader(client.
                            getInputStream()));
                    out1 = client.getOutputStream();
                } catch (IOException ioe) {}
                ;
     
          // déclenche la capture d'image et envoi toutes les 1/2 secondes
     
                while (connecte == true) {
                    // récupère un contrôle sur le flux
                    FrameGrabbingControl fgc = (FrameGrabbingControl) player.
                                               getControl(
                            "javax.media.control.FrameGrabbingControl");
                    Buffer buf;
                    // récupère un Buffer contenant l'image demandée
                    buf = fgc.grabFrame();
                    // convertion du buffer en image (via BufferToImage)
                    BufferToImage btoi;
                    btoi = new BufferToImage((VideoFormat) buf.getFormat());
                    Image img;
                    // création de l'image
                    img = btoi.createImage(buf);
                    //conversion nuance gris & noir & comptage pixel noir
                    iObserver observer = new iObserver();
                    int width1 = img.getWidth(observer);
                    int height1 = img.getHeight(observer);
                    int[] rawPixels = getPixels(img, width1, height1);
                    int TailleImage = rawPixels.length;
                    int noirs = calculerPixelsNoirs(rawPixels, TailleImage);
                    System.out.println("Nombres de pixels noirs = " + noirs);
                    //méthode compareJPEG
                    //enregistrement image
                    saveJPEG(img, "Screen.jpeg");
     
                    try
                     {
                        Thread.sleep(500);
                     } catch (InterruptedException ex) {}
                }
            }
        } catch (NoDataSourceException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (NoProcessorException e) {
                e.printStackTrace();
            } catch (NoPlayerException e) {
                e.printStackTrace();
            }
        }

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    L'algo que je veux faire est peut être pas génial. Si vous avez des propositions, je suis tout ouïe

  6. #6
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Et ta question c'est quoi exactement ?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Comment coder l'algo que j'ai fait et si c'est pas possible une idée pour un autre

  8. #8
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par Ashkell Voir le message
    Comment coder l'algo que j'ai fait et si c'est pas possible une idée pour un autre
    Ben il faut nous expliquer ce qui ne marche pas dans ton code ...

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Bah justement mon algo est merdique et j'aimerai avoir un truc simple pour la comparaison d'image

Discussions similaires

  1. Réponses: 6
    Dernier message: 03/04/2007, 20h40
  2. Algorithmes de comparaison de 2 arbres
    Par Jaxofun dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 27/04/2006, 11h10
  3. algorithme de comparaison
    Par sarakova dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 26/02/2006, 15h17
  4. Algorithme de comparaison lexicale
    Par BizuR dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 06/07/2005, 14h08
  5. Réponses: 10
    Dernier message: 30/06/2005, 12h20

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