web-dev-qa-db-fra.com

Tesseract OCR exemple simple

Bonjour Pouvez-vous me donner un exemple simple de test de Tesseract OCR De préférence en C #.
J'ai essayé la démo trouvée ici . Je télécharge le jeu de données anglais et le lecteur décompressé en C. et modifié le code comme suit:

string path = @"C:\pic\mytext.jpg";
Bitmap image = new Bitmap(path);
Tesseract ocr = new Tesseract();
ocr.SetVariable("tessedit_char_whitelist", "0123456789"); // If digit only
ocr.Init(@"C:\tessdata\", "eng", false); // To use correct tessdata
List<tessnet2.Word> result = ocr.DoOCR(image, Rectangle.Empty);
foreach (tessnet2.Word word in result)
    Console.WriteLine("{0} : {1}", Word.Confidence, Word.Text);

Malheureusement, le code ne fonctionne pas. le programme meurt sur la ligne "ocr.Init (..."). Je ne pouvais même pas obtenir une exception, même avec try-catch.

J'ai pu exécuter le vietocr ! mais c’est un très gros projet à suivre. J'ai besoin d'un exemple simple comme ci-dessus. 

Merci

21
Will Robinson

D'accord. J'ai trouvé la solution ici tessnet2 ne parvient pas à charger La réponse donnée par Adam

Apparemment, j'utilisais une mauvaise version de Tessdata. Je suivais la la page source instruction de manière intuitive, ce qui posait problème. 

ça dit

Utilisation rapide de Tessnet2

  1. Téléchargez le fichier binaire ici , ajoutez une référence de Assembly Tessnet2.dll à votre projet .NET.

  2. Téléchargez le fichier de définition de données de langue ici et mettez-le dans le répertoire tessdata. Répertoire Tessdata et votre exe doit être dans le même répertoire.

Après avoir téléchargé le binaire, lorsque vous suivez le lien pour télécharger le fichier de langue, il existe de nombreux fichiers de langue. mais aucun d'entre eux sont la bonne version. vous devez sélectionner toutes les versions et aller à la page suivante pour obtenir la version correcte (tesseract-2.00.eng)! Ils doivent soit mettre à jour le lien binaire de téléchargement vers la version 3, soit placer le fichier de langue de la version 2 sur la première page. Ou du moins en gras, mentionnons le fait que cette version est un gros problème!

En tout cas, je l'ai trouvé ... Merci à tous.

19
Will Robinson

Un exemple simple de test de l'OCR Tesseract en C #:

    public static string GetText(Bitmap imgsource)
    {
        var ocrtext = string.Empty;
        using (var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default))
        {
            using (var img = PixConverter.ToPix(imgsource))
            {
                using (var page = engine.Process(img))
                {
                    ocrtext = page.GetText();
                }
            }
        }

        return ocrtext;
    }

Info: Le dossier tessdata doit exister dans le référentiel: bin\Debug \

J'ai pu le faire fonctionner en suivant ces instructions .

  • Téléchargez le exemple de codeTesseract sample code

  • Décompressez-le à un nouvel emplacement

  • Ouvrez ~\tesseract-samples-master\src\Tesseract.Samples.sln (j'ai utilisé Visual Studio 2017).

  • Installez le package Tesseract NuGet pour ce projet (ou désinstallez/réinstallez le cas échéant) NuGet Tesseract

  • Décommentez les deux dernières lignes significatives de Tesseract.Samples.Program.cs: Console.Write("Press any key to continue . . . "); Console.ReadKey(true);

  • Run (frappé F5)

  • Vous devriez obtenir cette sortie de la console Windows enter image description here

1
Doppelganger

Essayez de mettre à jour la ligne pour:

ocr.Init (@ "C: \", "eng", false); // le chemin ici devrait être le dossier parent de tessdata

1
Rachel

Cela a fonctionné pour moi, j’avais 3-4 plus PDF à Extracteur de texte et si l’on ne fonctionne pas, l’autre sera ... plus particulièrement, ce code peut être utilisé sous Windows 7, 8, Server 2008. J'espère que ça te sera utile

    do
    {
    // Sleep or Pause the Thread for 1 sec, if service is running too fast...
    Thread.Sleep(millisecondsTimeout: 1000);
    Guid tempGuid = ToSeqGuid();
    string newFileName = tempGuid.ToString().Split('-')[0];
    string outputFileName = appPath + "\\pdf2png\\" + fileNameithoutExtension + "-" + newFileName +
                            ".png";
    extractor.SaveCurrentImageToFile(outputFileName, ImageFormat.Png);
    // Create text file here using Tesseract
    foreach (var file in Directory.GetFiles(appPath + "\\pdf2png"))
    {
        try
        {
            var pngFileName = Path.GetFileNameWithoutExtension(file);
            string[] myArguments =
            {
                "/C tesseract ", file,
                " " + appPath + "\\png2text\\" + pngFileName
            }; // /C for closing process automatically whent completes
            string strParam = String.Join(" ", myArguments);

            var myCmdProcess = new Process();
            var theProcess = new ProcessStartInfo("cmd.exe", strParam)
            {
                CreateNoWindow = true,
                UseShellExecute = false,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                WindowStyle = ProcessWindowStyle.Minimized
            }; // Keep the cmd.exe window minimized
            myCmdProcess.StartInfo = theProcess;
            myCmdProcess.Exited += myCmdProcess_Exited;
            myCmdProcess.Start();

            //if (process)
            {
                /*
                MessageBox.Show("cmd.exe process started: " + Environment.NewLine +
                                "Process Name: " + myCmdProcess.ProcessName +
                                Environment.NewLine + " Process Id: " + myCmdProcess.Id
                                + Environment.NewLine + "process.Handle: " +
                                myCmdProcess.Handle);
                */
                Process.EnterDebugMode();
                //ShowWindow(hWnd: process.Handle, nCmdShow: 2);
                /*
                MessageBox.Show("After EnterDebugMode() cmd.exe process Exited: " +
                                Environment.NewLine +
                                "Process Name: " + myCmdProcess.ProcessName +
                                Environment.NewLine + " Process Id: " + myCmdProcess.Id
                                + Environment.NewLine + "process.Handle: " +
                                myCmdProcess.Handle);
                */
                myCmdProcess.WaitForExit(60000);
                /*
                MessageBox.Show("After WaitForExit() cmd.exe process Exited: " +
                                Environment.NewLine +
                                "Process Name: " + myCmdProcess.ProcessName +
                                Environment.NewLine + " Process Id: " + myCmdProcess.Id
                                + Environment.NewLine + "process.Handle: " +
                                myCmdProcess.Handle);
                */
                myCmdProcess.Refresh();
                Process.LeaveDebugMode();
                //myCmdProcess.Dispose();
                /*
                MessageBox.Show("After LeaveDebugMode() cmd.exe process Exited: " +
                                Environment.NewLine);
                */
            }


            //process.Kill();
            // Waits for the process to complete task and exites automatically
            Thread.Sleep(millisecondsTimeout: 1000);

            // This works fine in Windows 7 Environment, and not in Windows 8
            // Try following code block
            // Check, if process is not comletey exited

            if (!myCmdProcess.HasExited)
            {
                //process.WaitForExit(2000); // Try to wait for exit 2 more seconds
                /*
                MessageBox.Show(" Process of cmd.exe was exited by WaitForExit(); Method " +
                                Environment.NewLine);
                */
                try
                {
                    // If not, then Kill the process
                    myCmdProcess.Kill();
                    //myCmdProcess.Dispose();
                    //if (!myCmdProcess.HasExited)
                    //{
                    //    myCmdProcess.Kill();
                    //}

                    MessageBox.Show(" Process of cmd.exe exited ( Killed ) successfully " +
                                    Environment.NewLine);
                }
                catch (System.ComponentModel.Win32Exception ex)
                {
                    MessageBox.Show(
                        " Exception: System.ComponentModel.Win32Exception " +
                        ex.ErrorCode + Environment.NewLine);
                }
                catch (NotSupportedException notSupporEx)
                {
                    MessageBox.Show(" Exception: NotSupportedException " +
                                    notSupporEx.Message +
                                    Environment.NewLine);
                }
                catch (InvalidOperationException invalidOperation)
                {
                    MessageBox.Show(
                        " Exception: InvalidOperationException " +
                        invalidOperation.Message + Environment.NewLine);
                    foreach (
                        var textFile in Directory.GetFiles(appPath + "\\png2text", "*.txt",
                            SearchOption.AllDirectories))
                    {
                        loggingInfo += textFile +
                                       " In Reading Text from generated text file by Tesseract " +
                                       Environment.NewLine;
                        strBldr.Append(File.ReadAllText(textFile));
                    }
                    // Delete text file after reading text here
                    Directory.GetFiles(appPath + "\\pdf2png").ToList().ForEach(File.Delete);
                    Directory.GetFiles(appPath + "\\png2text").ToList().ForEach(File.Delete);
                }
            }
        }
        catch (Exception exception)
        {
            MessageBox.Show(
                " Cought Exception in Generating image do{...}while{...} function " +
                Environment.NewLine + exception.Message + Environment.NewLine);
        }
    }
    // Delete png image here
    Directory.GetFiles(appPath + "\\pdf2png").ToList().ForEach(File.Delete);
    Thread.Sleep(millisecondsTimeout: 1000);
    // Read text from text file here
    foreach (var textFile in Directory.GetFiles(appPath + "\\png2text", "*.txt",
        SearchOption.AllDirectories))
    {
        loggingInfo += textFile +
                       " In Reading Text from generated text file by Tesseract " +
                       Environment.NewLine;
        strBldr.Append(File.ReadAllText(textFile));
    }
    // Delete text file after reading text here
    Directory.GetFiles(appPath + "\\png2text").ToList().ForEach(File.Delete);
} while (extractor.GetNextImage()); // Advance image enumeration... 
0
Kaushal B

Voici un excellent exemple de projet de travail; Exemple d'OCR Tesseract (Visual Studio) avec prétraitement Leptonica Exemple d'OCR Tesseract (Visual Studio) avec prétraitement Leptonica

L’API Tesseract OCR 3.02.02 peut être source de confusion. Elle vous guide donc dans l’inclusion des dll Tesseract et Leptonica dans un projet Visual Studio C++ et fournit un exemple de fichier qui prend un chemin d’image pour le prétraitement et l’OCR. Le script de prétraitement de Leptonica convertit l'image d'entrée en un texte de type livre noir et blanc.

Installer

Pour l'inclure dans vos propres projets, vous devrez référencer les fichiers d'en-tête et lib et copier les dossiers tessdata et les dll.

Copiez le dossier tesseract-include dans le dossier racine de votre projet. Maintenant, cliquez sur votre projet dans Visual Studio Solution Explorer, puis sélectionnez Projet> Propriétés.

Répertoires VC++> Inclure les répertoires:

..\tesseract-include\tesseract; ..\tesseract-include\leptonica; $ (IncludePath) C/C++> Préprocesseur> Préprocesseur Définitions:

_CRT_SECURE_NO_WARNINGS;% (PreprocessorDefinitions) C/C++> Éditeur de liens> Entrée> Dépendances supplémentaires:

..\tesseract-include\libtesseract302.lib; ..\tesseract-include\liblept168.lib;% (AdditionalDependencies) Vous pouvez maintenant inclure des en-têtes dans le fichier de votre projet:

comprendre 

comprendre 

Maintenant, copiez les deux fichiers DLL dans tesseract-include et le dossier tessdata dans Debug dans le répertoire de sortie de votre projet.

Lorsque vous initialisez tesseract, vous devez spécifier l'emplacement du dossier parent (! Important) du dossier tessdata s'il ne s'agit pas déjà du répertoire en cours de votre fichier exécutable. Vous pouvez copier mon script, ce qui suppose que tessdata est installé dans le dossier de l'exécutable.

tesseract :: TessBaseAPI * api = nouveau tesseract :: TessBaseAPI (); api-> Init ("D:\tessdataParentFolder \", ... Exemple

Vous pouvez compiler l'exemple fourni, qui utilise un argument de ligne de commande du chemin de l'image à utiliser. La fonction preprocess () utilise Leptonica pour créer une copie en noir et blanc de l'image, comme un livre, qui permet à tesseract de fonctionner avec une précision de 90%. La fonction ocr () affiche la fonctionnalité de l'API Tesseract pour renvoyer une sortie de chaîne. Le toClipboard () peut être utilisé pour enregistrer du texte dans le presse-papier sous Windows. Vous pouvez les copier dans vos propres projets.

0
Alex G

J'ai eu le même problème, maintenant c'est résolu. J'ai tesseract2, sous ces dossiers pour 32 bits et 64 bits, j'ai copié les fichiers dossier 64 bits (car mon système est 64 bits) dans le dossier principal ("Tesseract2") et sous le dossier bin/Debug. Maintenant, ma solution fonctionne bien.

0
Prasad

Dans mon cas, je les avais tous travaillés à l'exception de la reconnaissance de caractères correcte. 

Mais vous devez considérer ces quelques choses:

  • Utiliser la bonne bibliothèque tessnet2
  • utiliser la version correcte de la langue tessdata
  • tessdata devrait être quelque part hors de votre dossier d'application où vous pouvez mettre le chemin complet dans le paramètre init. utiliser ocr.Init(@"c:\tessdata", "eng", true);
  • Le débogage vous causera des maux de tête. Ensuite, vous devez mettre à jour votre application.config. (Je ne peux pas mettre le code XML ici. Donnez-moi votre email, je vous l'enverrai par email)

espérons que cela aide

0
Muadzir Aziz