Bonjour à tous,

Je travaille sur un projet qui permet de faire de l'OCR.
J'utilise une librairie (tessnet2 qui utilise le moteur Tesseract-ocr).
J'ai dans mon programme principal (program.cs) toutes les fonctions qui permettent de faire l'ocr.

Je voudrais organiser tout cela et créer une autre classe qui:
- permet de créer un constructeur qui initialise l'objet ocr
- qui comporte des fonctions qui permettent le traitement de l'image et les regex

Voici le 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
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using tessnet2;
using System.Collections.ObjectModel;
 
namespace ConsoleApplication1
{
	class Program
	{
		static void Main(string[] args)
		{
            try
            {
                //le fichier crée se trouve dans ConsoleApplication1/ConsoleApplication1/Bin/debug
                //permet de convertir une image en ocr
                // génère aussi un fichier texte contenant l'OCR                
 
			    string projectFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase).Replace("file:\\", "");
                string imgPath = Path.Combine(projectFolder, "img", "doc.tif"); //.jpg, .tiff, .bmp, .png
                Bitmap image = new Bitmap(imgPath);
                Tesseract ocr = new Tesseract(); 
 
 
                // Vu comment fonctionnent les images dans ce projet, il faut les inclure (clic droit > inclure dans le projet) et les copier à la compilation (propriétés > copier si plus récent)
				ocr.Init(Path.Combine(projectFolder, "tessdata"), "eng", false);                              
                List<tessnet2.Word> result = ocr.DoOCR(image, System.Drawing.Rectangle.Empty);
                string Results = ""; //initialisation de la variable à blanc pour pouvoir remplir sa valeur avec le texte
 
                foreach (tessnet2.Word word in result)
                {                    
                    Results += word.Text+ " ";
                }
 
                //c'est dans le fichier ocrTesting2 que le contenu de l'image de départ est créé
                using (StreamWriter writer = new StreamWriter(@"ocrTesting2.txt", true))
                {
                    writer.WriteLine(Results);
                    writer.Close();
                }
                Console.WriteLine("completed, go to ConsoleApplication1/ConsoleApplication1/bin/debug to see your text file");
 
 
                //Test recherche    
 
                /*cette méthode permet de rechercher toutes les occurences (chiffres) correspondant à l'expression régulière
                On parcourt toutes les lignes pour vérifier l'existence d'un ou plusieurs chiffres
                puis on affiche la position et le nombre de fois qu'on trouve le chiffre correspondant
                Pour exemple, j'ai choisit de définir un regex qui permet de retrouver un chiffre codé sur 10 caractère (ex: 8745123698) dans le texte ocrTesting que l'on a généré*/
 
 
                //condition vérifiant l'existence du fichier ocrTesting2.txt 
                /* supprime le fichier texte s'il existe*/
 
                StreamReader sr = new StreamReader(@"ocrTesting2.txt");
                string input;
 
                // il faut modifier le pattern en fonction du type de recherche que l'on veut effectuer
                string pattern = @"\D+(\d{10,10})\D+";               
                Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
 
                /*la méthode Match permet de rechercher toutes 
                les occurences qui sont définies par l'expressions régulières*/
 
                int matchCount = 0;
                while (sr.Peek() >= 0)
                {
                    input = sr.ReadLine();
                    Console.WriteLine("DEBUTLIGNE----------------------------------------------");
                    Console.WriteLine("Ligne:" + input);
                    Match m = rgx.Match(input);
                    while (m.Success)
                    {
                        Console.WriteLine("Match" + (++matchCount)); //on affiche le nombre de fois qu'on a trouvé le chiffre correspondant au pattern
                        for (int i = 1; i <= 2; i++)
                        {
                            Group g = m.Groups[i];
                            Console.WriteLine("Group" + i + "='" + g + "'");
                            CaptureCollection cc = g.Captures;
                            for (int j = 0; j < cc.Count; j++)
                            {
                                Capture c = cc[j];
                                System.Console.WriteLine("Capture" + j + "='" + c + "', Position=" + c.Index); //on affiche également la position (sur quelle ligne) se trouve le ou les chiffres
                            }
                        }
                        m = m.NextMatch();
                    }
                    Console.WriteLine("FINLIGNE------------------------------------------------");
                }
                sr.Close();
 			}              
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
			Console.ReadLine();
        }         
 
    }
}
si vous avez des questions, n'hésitez pas !!