Partage
  • Partager sur Facebook
  • Partager sur Twitter

Reconnaissance de texte sur une image en java

    14 février 2017 à 12:40:42

    Bonjour,

    J'essaye de développer en java, un outil permettant la reconnaissance de texte à partir d'une photo. J'ai repris du code que j'ai trouvé sur des tutos qui utilise les librairies opencv et tess4j. Mais les résultats ne sont pas bons. Je n'ai pas l'impression qu'aujourd'hui, il existe des librairies open source totalement abouties, ou bien c'est moi qui ne les utilisent pas bien. Quelqu'un aurait-il une idée ?

    Voici une image source :

    compteur de voiture

    Voici mon code pour traiter mon image avec opencv :

    package essai;
    
    import java.awt.image.BufferedImage;
    import java.awt.image.DataBufferByte;
    import java.io.File;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    
    import org.opencv.core.Core;
    import org.opencv.core.CvType;
    import org.opencv.core.Mat;
    import org.opencv.core.Size;
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    
    public class Essai {
    	private static final int CV_ADAPTIVE_THRESH_MEAN_C = 0;
    	private static final int CV_THRESH_BINARY = 0;
    	static BufferedImage image = null;
    	
    	public static void main(String[] args){
    		String path ="C:/Users/Vincent/Documents/dev/image/";
    		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
            File input = new File(path + "compteur.jpg");
            
            
    		try {
    			image = ImageIO.read(input);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}	
    
            byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
            Mat img = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC3);
            img.put(0, 0, data);
            
    
    		// conversion BGR to gray
    		Mat imgGray = new Mat();
    		Imgproc.cvtColor(img, imgGray, Imgproc.COLOR_BGR2GRAY);
    		Imgcodecs.imwrite(path + "essai_imgGray.jpg", imgGray);
    
    		// conversion gray to gaussian blur
    		Mat imgGaussianBlur = new Mat(); 
    		Imgproc.GaussianBlur(imgGray,imgGaussianBlur,new Size(5, 5),0);
    		Imgcodecs.imwrite(path + "essai_gaussian_blur.jpg", imgGaussianBlur);
    		
    		// conversion Sobel to find vertical edges (bords)
    		Mat imgSobel = new Mat(); 
    		Imgproc.Sobel(imgGaussianBlur, imgSobel, -1, 1, 0);
    		Imgcodecs.imwrite(path + "essai_sobel.jpg", imgGaussianBlur);
    		
    		Mat imgAdaptiveThreshold = new Mat();
    		Imgproc.adaptiveThreshold(imgSobel, imgAdaptiveThreshold, 255, CV_ADAPTIVE_THRESH_MEAN_C ,CV_THRESH_BINARY, 99, 4);
    		Imgcodecs.imwrite(path + "essai_threshold.png", imgAdaptiveThreshold);
    
    	}
    }

    et voici mon code pour récupérer les caractères :

    package ocr;
     import java.io.*;
    import net.sourceforge.tess4j.*;
    public class MySample {
     public static void main(String[] args) {
      File imageFile = new File("C:/Users/Vincent/Documents/dev/image/essai_threshold.png");
      ITesseract instance = new Tesseract();
      //instance.setTessVariable("tessedit_char_whitelist", "0123456789");
      try {
       String result = instance.doOCR(imageFile);
       System.out.println(result);
      } catch (TesseractException e) {
       System.err.println(e.getMessage());
      }
     }
    }
    

    Merci d'avance pour vos conseils.



    • Partager sur Facebook
    • Partager sur Twitter
      19 février 2017 à 15:53:06

      Quelqu'un pourrait m'aiguiller SVP?

      -
      Edité par Bulan 19 février 2017 à 15:53:20

      • Partager sur Facebook
      • Partager sur Twitter
        19 février 2017 à 18:09:05

        OpenCV me parait être la librairie la plus adaptée... Qu'est ce qui n'est pas bon ? la reconnaissance est lente ? Ou elle est tout simplement fausse ?
        • Partager sur Facebook
        • Partager sur Twitter

        Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie.

          19 février 2017 à 20:20:16

          La reconnaissance est fausse. Le résultat est une suite de caractères qui n'ont rien à voir. Voici un extrait :

          .‘r +3l’é.'~_? I V’ ‘ .' W
          AW. “(if-2'9“. 5? ..'c {W}: ‘ “$3;
          “: 53 ?g! “‘54 .775 ;-5":1‘".":: .. +15% “2'“
          ’. 1+ M- w z

          Je pensais que c'était à cause de la police, qu'il ne reconnaissait pas les caractères digitaux. J'ai donc installé une police "nombre digital" sur mon pc mais aucun changement.

          J'ai installé jTessBoxEditor mais pour le moment je ne m'en sors pas.

          -
          Edité par Bulan 19 février 2017 à 20:23:11

          • Partager sur Facebook
          • Partager sur Twitter
            23 février 2017 à 14:14:10

            Hello,

            pour avoir des résultat performant il faut partir sur du machine learning en donnant un très grand nombre de photo en entrée pour que la recherche s'affine au fur et à mesure => feed the algorithm !

            C'est le cas (entre autre) pour les algo d'OCR et de Speech to Text. 

            Tu n'auras jamais de bon résultats de cette façon. Après si tu veux toujours analyser ce type d'image, tu peux faire un algo maison, la police d'écriture étant digitale, il est très facile de distinguer les chiffres avec openCV.

            PS: en plus, déjà que c'est dur à calibrer sur un scan, imagine avec la qualité de la photo ^^.

            -
            Edité par arno21 23 février 2017 à 14:20:42

            • Partager sur Facebook
            • Partager sur Twitter

            Mon projet: SpotRoom. N'hésites pas à passer dire ce que tu en penses !

              23 février 2017 à 22:33:45

              Je suis d'accord avec Arno, du deep learning me paraît plus approprié, seulement je croyais que opencv le faisait déjà... Désolé donc
              • Partager sur Facebook
              • Partager sur Twitter

              Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie.

                24 février 2017 à 10:22:00

                Je ne connais pas assez OpenCV mais oui de nombreuses lib permettent de faire ça. Encore faut il l'implémenter et faire plusieurs milliers de photos pour améliorer la précision de la détection.
                • Partager sur Facebook
                • Partager sur Twitter

                Mon projet: SpotRoom. N'hésites pas à passer dire ce que tu en penses !

                  25 février 2017 à 14:19:15

                  Merci pour vos réponses, je vais regarder le deep learning ...
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Reconnaissance de texte sur une image en java

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown